2011-05-27 3 views
7

Когда Merge into делает insert со следующим утверждением, Scope_Identity возвращает правильную ключевую информацию о суррогатах. Однако, когда выполняется update и Scope_Identity и @@Identity, возвратите следующий доступный суррогатный ключ. И когда я добавил output, я получаю нуль на обоих update и insert.Использование MERGE INTO с Scope_IDENTITY

Как вернуть суррогатную клавишу как на 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() 

ответ

8

Используйте таблицу inserted псевдо в вашем 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.* ; 

Это возвращает то, что значения находятся в таблице (для затронутых строк) в конце заявления.

+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

Смежные вопросы