9

次のステートメントでをMerge into実行すると、正しい代理キー情報が返されます。ただし、両方を実行すると、次に使用可能な代理キーが返されます。そして、を追加すると、との両方でnullが発生します。insertScope_IdentityupdateScope_Identity@@Identityoutputupdateinsert

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

2 に答える 2

11

OUTPUT 句insertedで疑似テーブルを使用します。

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

これは、ステートメントの最後に (影響を受ける行の) テーブルにある値を返します。

于 2011-05-27T13:22:51.850 に答える
8
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())
于 2014-07-14T12:21:32.500 に答える