1

如果未找到更新匹配,我需要使用一个序列来重新计算主键中的两个字段。是否仍然可以在这里使用 MERGE 语句?我试过 WHEN MATCHED THEN BEGIN,但 BEGIN 在这里无效。

具体来说,我有一对构成主键的数字。第一个是分组,第二个是组内的一系列项目。如果出现问题,该组以 99990 的形式出现,我需要将它与序列组合并使用序列来递增,然后将其拆分回来。因此,当组以 99990 出现时,我计算的组的范围可以从 99990 到 99999,然后序列号的范围将从 00 到 99。

作为 INSERT 分配的一部分,我想不出一种方法来执行此操作,而且我不知道如何使 MERGE 执行多个步骤,所以我猜我回到了 UPDATE,如果 @@ROWCOUNT = 0 开始。任何人都有更快的方法来做到这一点?

4

2 回答 2

3

这行得通,

  1. 声明一个名为 @isinsert 的标志变量(位)
  2. 将其初始化为 1。
  3. 在更新子句中将其设置为 0。

像这样:(假设一个名为 table1 的表带有一个数字 'id' 字段和一个 nvarchar 'field1' 字段)。

declare @id numeric(18,0)                  -- That's the he lookup key 
set @id=999                                -- We use id as the search key
                                           -- You can use any other field    
declare @field nvarchar(50)
set @field = 'insert or update value(s)'   -- This is the new value

declare @isinsert bit                      -- This is a flag that will
set @isinsert=1                            -- indicate whether an insert or 
                                           -- an update were performed 

MERGE table1 AS target
    USING (SELECT @field) AS source (field1)
    ON (target.id = @id)
    WHEN MATCHED THEN 
        UPDATE SET field1 = source.field1
        ,@isinsert = 0                     -- Set @isinsert to 0 on updates
    WHEN NOT MATCHED THEN   
        INSERT (field1)
        VALUES (source.field1);

if (@isinsert=1) print concat('inserted record at id: ',@@IDENTITY)
else print concat('updated record at id: ',@id)
于 2014-03-28T10:30:36.663 回答
0

不幸的是,不可能在 MERGE 中执行多个步骤。有时可以使用新的公用表表达式语法,但我使用了 UPDATE, IF @@ROWcOUNT = 0, INSERT 所以我可以在插入时执行多个步骤。

于 2013-07-03T12:56:50.490 回答