什么不匹配的多个步骤可能?

时间:2013-06-28 17:34:19

标签: sql sql-server merge

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

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

作为INSERT赋值的一部分,我无法想到这样做的方法,我无法弄清楚如何让MERGE做多个步骤,所以我猜我回到UPDATE,IF @@ ROWCOUNT = 0 BEGIN。有人有更快的方法吗?

2 个答案:

答案 0 :(得分:3)

这有效,

  1. 声明一个名为@isinsert
  2. 的标志变量(位)
  3. 使用值1初始化它。
  4. 在update子句中将其设置为0.
  5. 像这样:(假设一个名为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)
    

答案 1 :(得分:0)

不幸的是,在MERGE中无法执行多个步骤。有时候可以使用新的Common Table Expression语法,但我使用UPDATE,IF @@ ROWcOUNT = 0,INSERT,这样我就可以在插入上执行多个步骤。