21

s およびs の句をT-SQL使用して、同期ロジックを実装するスクリプトがあります。OUTPUTMERGEINSERT

OUTPUT現在、その上にロギング レイヤーを追加しており、値をレポート テーブルに書き込むための 2 番目の句を追加したいと考えています。

ステートメントに 2 番目のOUTPUT句を追加できます。MERGE

MERGE TABLE_TARGET AS T
USING TABLE_SOURCE AS S
ON (T.Code = S.Code) 
WHEN MATCHED AND T.IsDeleted = 0x0
    THEN UPDATE SET ....
WHEN NOT MATCHED BY TARGET 
    THEN INSERT ....
OUTPUT inserted.SqlId, inserted.IncId
INTO @sync_table
OUTPUT $action, inserted.Name, inserted.Code;

これは機能しますが、ターゲットを追加しようとする限り

INTO @report_table;

の前に次のエラー メッセージが表示されますINTO

A MERGE statement must be terminated by a semicolon (;)

ここで同様の質問を見つけましたが、挿入しようとしているフィールドが 2 つのテーブル間で重複せず、動作中の同期ロジックを変更したくないため (可能であれば)、それ以上は役に立ちませんでした。

アップデート:

マーティン・スミスの回答の後、別のアイデアがあり、次のようにクエリを書き直しました。

INSERT INTO @report_table (action, name, code)
SELECT M.Action, M.Name, M.Code
FROM
(
MERGE TABLE_TARGET AS T
USING TABLE_SOURCE AS S
ON (T.Code = S.Code) 
WHEN MATCHED AND T.IsDeleted = 0x0
    THEN UPDATE SET ....
WHEN NOT MATCHED BY TARGET 
    THEN INSERT ....
OUTPUT inserted.SqlId, inserted.IncId
INTO @sync_table
OUTPUT $action as Action, inserted.Name, inserted.Code
) M

残念ながら、このアプローチも機能しませんでした。実行時に次のエラー メッセージが出力されます。

An OUTPUT INTO clause is not allowed in a nested INSERT, UPDATE, DELETE, or MERGE statement.

OUTPUTしたがって、 1 つの DML ステートメントに複数の句を含める方法は絶対にありません。

4

4 に答える 4

18

ありえない。文法を参照してください。

Merge ステートメントには

[ <output_clause> ]

角かっこは、オプションの出力句を持つことができることを示しています。そのための文法は

<output_clause>::=
{
    [ OUTPUT <dml_select_list> INTO { @table_variable | output_table }
        [ (column_list) ] ]
    [ OUTPUT <dml_select_list> ]
}

OUTPUT INTOこの句には、と の両方を含めることができますがOUTPUT、同じものを 2 つ含めることはできません。

複数が許可されている場合、文法は次のようになります[ ,...n ]

于 2013-06-18T10:11:32.003 に答える