Использование MERGE INTO с Scope_IDENTITY - PullRequest
8 голосов
/ 27 мая 2011

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

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

Ответы [ 2 ]

10 голосов
/ 27 мая 2011

Используйте псевдо-таблицу inserted в своем предложении OUTPUT :

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

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

5 голосов
/ 14 июля 2014
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())
...