sql – 使用带有Scope_IDENTITY的MERGE INTO

前端之家收集整理的这篇文章主要介绍了sql – 使用带有Scope_IDENTITY的MERGE INTO前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
当Merge into使用以下语句执行插入时,Scope_Identity返回正确的代理键信息.但是,当执行更新时,Scope_Identity和@@ Identity都会返回下一个可用的代理键.当我添加输出时,我在update和insert上都得到null.

如何在更新和插入上返回代理键?

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
       )

output CurrentSet.*,@Surrogate_KEY ;

 print @Surrogate_KEY
 print @@IDENTITY
 print SCOPE_IDENTITY()

解决方法

使用 OUTPUT clause中的inserted伪表:
DECLARE @Surrogate_KEY bigint


MERGE INTO [dbo].[MyTable] ChangeSet
USING (SELECT   @NaturalKey1 AS NaturalKey1,blah
       )

output inserted.* ;

这将返回语句末尾表中的值(对于受影响的行).

猜你在找的MsSQL相关文章