如果找不到更新匹配,我需要使用一个序列来重新计算主键中的两个字段。是否仍然可以在这里使用MERGE语句?我尝试了匹配然后开始,但BEGIN在这里无效。
具体来说,我有一对构成主键的数字。第一个是分组,第二个是组内的一系列项目。如果出现问题,该组将以99990进入,我需要将其与序列组合并使用序列递增,然后将其拆分。因此,当该组进入99990时,我计算的组的范围可以从99990到99999,序列号将在00到99之间。
作为INSERT赋值的一部分,我无法想到这样做的方法,我无法弄清楚如何让MERGE做多个步骤,所以我猜我回到UPDATE,IF @@ ROWCOUNT = 0 BEGIN。有人有更快的方法吗?
答案 0 :(得分:3)
这有效,
像这样:(假设一个名为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,这样我就可以在插入上执行多个步骤。