OUTPUTを使用したMERGEが正しく動作していないようです


8

テーブルに外部キーを追加し、FKに違反する行を削除して、ModifiedTable_invalidテーブルにコピーしています。スクリプトの一部として、次のMERGEコマンドを取得しました。

MERGE ModifiedTable t1
USING TargetTable tt
ON t1.JoinColumn = tt.JoinColumn
WHEN MATCHED THEN
    UPDATE SET t1.FkColumn = tt.FkSource
WHEN NOT MATCHED BY SOURCE THEN DELETE
OUTPUT DELETED.* INTO ModifiedTable_invalid;

ただし、このコマンドは、MERGEコマンドによって削除された行だけでなく、ModifiedTableからModifiedTable_invalidにすべての行を挿入しているようです。何が起こっているのですか?削除された行のみをModifiedTable_invalidに配置するにはどうすればよいですか?

回答:


11

行を更新すると、inserted(更新後の値)とdeleted(更新前の値)の両方の疑似テーブルに表示されます。これが奇妙に思われる場合は、更新が論理的に削除とそれに続く挿入であると考えてください(ただし、更新はそのように物理的に実行されない場合があります)。

とともに使用するとMERGE、このOUTPUT句にという名前の列を追加できます$action。(取られたアクションが表示されますあなたのクエリにこの列を追加'INSERT''UPDATE'または'DELETE'行ごとに)。

例えば:

insert into ModifiedTable_invalid(Id /* And other columns */)
select
    Id
    /* And other columns */
from
(
    merge ModifiedTable t1
    using TargetTable t2 on t1.JoinColumn = t2.JoinColumn
    when matched then update set t1.FkColumn = t2.FkSource
    when not matched by source then delete
    output 
        $action as DMLAction,
        deleted.Id as Id /* And other columns... */
) outputs
where
    DMLAction = 'DELETE';

更新された行には$action=があり'UPDATE'ます。

その他のすばらしい例については、MERGEステートメントでのOUTPUTの使用に関するAdam Machanicの投稿も参照してください。


この動作は私には意味がありません。削除されていない行が表示されるのはなぜDELETED.*ですか?
thecoop

3
@thecoop-更新の「前」と「後」の値にアクセスできます。概念的には、更新が削除とそれに続く挿入であると考えるかもしれませんが、実際にはそうではありません。
マーティンスミス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.