2011-05-27 22 views
7

Merge intoinsertの場合、Scope_Identityは正しい代理キー情報を返します。しかしupdateScope_Identity@@Identity両方が可能な代理キーを返す行われた場合。私はoutputを追加したとき、私はupdateinsertの両方にヌルを取得します。Scope_IDENTITYでMERGE INTOを使用する

updateinsertの両方で代理キーを返すにはどうすればよいですか?

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() 

答えて

8

あなたOUTPUT clauseinserted擬似テーブルを使用します。

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.* ; 

これは、値が文の終わりに(影響を受けた行の)テーブルにあるものを返します。

+0

私はシンプルなものを残し知っていた、ありがとう! – KenL

4
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()) 
+0

は、このアプローチの単純さを愛して! – feetwet

関連する問題