13

常に単一のレコードを更新または挿入する必要があるマージ ステートメントがあります。そのステートメントのIDを変数に覚えておきたいです。次のようになります。

DECLARE @int int

MERGE dbo.table AS A
USING (SELECT 'stringtomatch' AS string) AS B ON B.string= A.string
WHEN MATCHED THEN 
    UPDATE SET somecolumn = 'something'
WHEN NOT MATCHED THEN
    INSERT 
    VALUES ('stringtomatch',
        'something')
OUTPUT @int = inserted.ID;

このように出力句に @int を設定できないため、これは機能しません。temptable を作成し、出力でINTO @temptableを使用できることはわかっています。しかし、それは常に単一のレコードであることを知っているので、ID を INT 変数に入れたいと思います。これは可能ですか?または、テーブル変数を使用する必要がありますか。いくつかの構文が欠けていることを願っています。

4

1 に答える 1

30

いいえ、OUTPUT でテーブル変数を使用する必要があります

ただし、これを行うことができます...

...
WHEN MATCHED THEN 
    UPDATE
    SET
       @int = ID,
       somecolumn = 'something'
WHEN NOT MATCHED THEN
    INSERT 
    VALUES ('stringtomatch',
        'something');

SET @int = ISNULL(@int, SCOPE_IDENTITY());

「UPDATE での割り当て」は、長い間 SQL Server の有効な構文でした。MSDN の MERGEも参照してください。どちらもこう言います。

...
<set_clause>::=

SET
...
@変数=式

于 2013-05-30T14:26:26.613 に答える