2011-05-27 10 views
7

Po wykonaniu Merge intoinsert z następującą instrukcją, Scope_Identity zwraca poprawne informacje klucza kluczowego. Jednak po wykonaniu update zarówno Scope_Identity jak i @@Identity zwrócą dostępny klucz zastępczy. I kiedy dodałem output, otrzymuję wartość zerową na obu update i insert.Używanie polecenia MERGE INTO z identyfikatorem Scope_IDENTITY

Jak mogę zwrócić klucz zastępczy zarówno na update, jak i na 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() 

Odpowiedz

8

Użyj tabeli inserted pseudo w swojej OUTPUT clause:

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

to zwraca cokolwiek Wartości są w tabeli (dla wierszy) na końcu zestawienia.

+0

Dziękuję, wiedziałem, że zostawiłem coś prostego! – 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

Uwielbiam prostotę tego podejścia! – feetwet