s およびs の句をT-SQL
使用して、同期ロジックを実装するスクリプトがあります。OUTPUT
MERGE
INSERT
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 ステートメントに複数の句を含める方法は絶対にありません。