[英]Using MERGE INTO with Scope_IDENTITY
當Merge into
使用以下語句進行insert
時, Scope_Identity
返回正確的代理鍵信息。 但是,當執行update
時, Scope_Identity
和@@Identity
都會返回下一個可用的代理鍵。 當我添加output
時,我在update
和insert
上都得到了 null 。
如何在update
和insert
上返回代理鍵?
DECLARE @Surrogate_KEY bigint
MERGE INTO [dbo].[MyTable] ChangeSet
USING (SELECT @NaturalKey1 AS NaturalKey1,
@NaturalKey2 AS NaturalKey2,
@NaturalKey3 AS NaturalKey3,
@Surrogate_KEY AS Surrogate_KEY) CurrentSet
ON ChangeSet.NaturalKey1 = CurrentSet.NaturalKey1 AND
ChangeSet.NaturalKey2 = CurrentSet.NaturalKey2 AND
ChangeSet.NaturalKey3 = CurrentSet.NaturalKey3
WHEN MATCHED THEN
UPDATE SET blah, blah, blah
WHEN NOT MATCHED
THEN INSERT VALUES
(
blah, blah, blah
)
output CurrentSet.*, @Surrogate_KEY ;
print @Surrogate_KEY
print @@IDENTITY
print SCOPE_IDENTITY()
在OUTPUT 子句中使用inserted
的偽表:
DECLARE @Surrogate_KEY bigint
MERGE INTO [dbo].[MyTable] ChangeSet
USING (SELECT @NaturalKey1 AS NaturalKey1,
@NaturalKey2 AS NaturalKey2,
@NaturalKey3 AS NaturalKey3,
@Surrogate_KEY AS Surrogate_KEY) CurrentSet
ON ChangeSet.NaturalKey1 = CurrentSet.NaturalKey1 AND
ChangeSet.NaturalKey2 = CurrentSet.NaturalKey2 AND
ChangeSet.NaturalKey3 = CurrentSet.NaturalKey3
WHEN MATCHED THEN
UPDATE SET blah, blah, blah
WHEN NOT MATCHED
THEN INSERT VALUES
(
blah, blah, blah
)
output inserted.* ;
這將返回語句末尾表中的任何值(對於受影響的行)。
DECLARE @Id ...
--
MERGE
dbo.Table AS Tgt
USING
(
SELECT
<Keys>
) AS Src
ON Src.<Keys> = Tgt.<Keys>
WHEN MATCHED THEN
UPDATE SET
<...>
,@Id = Tgt.Id
WHEN NOT MATCHED THEN
INSERT
(
...
)
VALUES
(
...
)
;--
RETURN/SET/PRINT ISNULL(@Id, SCOPE_IDENTITY())
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.