2016-12-22 19 views
0

SQL ServerのMERGEはどのように機能しますか?SQL MERGE文のINSERT、UPDATEおよびDELETE操作の順序を制御するものは何ですか?

実行される複数の操作(INSERTUPDATEDELETE)がある場合、何がこれらの操作が実行される順序を制御しますか?

+1

「MERGE」の[documentation](https://msdn.microsoft.com/en-us/library/bb510625.aspx)を読んだことがありますか?ステートメントの構文内で、一致条件に基づいてどのような条件でどのようなアクションを取るべきかを指定します。あなたが何をしようとしているのかを読んで、何かしようとしたら、特定の問題や疑問がある場合に戻ってください。 – 3N1GM4

答えて

0
MSDNから

:すべての挿入、更新のために

、またはMERGE 文で指定されたアクションを削除し、SQL Serverは、AFTERトリガーに対応するいずれかがターゲット表に を定義して発射するが、そのアクションに保証するものではありません。 トリガを最初または最後に発射します。

ドキュメントを正しく理解していれば、SQL Serverはいかなる保証もいたしません。それはあなたの照会を適切と見なして実行します。

+0

'MERGE'自体が' INSERT'、 'UPDATE'および' DELETE'sをどのように扱うのではなく、 'MERGE'を実行するターゲット表のトリガーをSQLがどのように処理するかをこの引用符では示していませんか? – 3N1GM4

+0

はい、それは良い点です。私は、注文が重要である理由を考えることができませんでした。ほとんどの場合、1つの操作と見なすことができます。しかし、あなたのデータベースにスパゲッティトリガー*の混乱が含まれていれば*実行の順序は重要かもしれません。いずれにしても、元の質問に対するあなたのコメントはより良い回答であると思います。 –

0

documentationMERGEとして、私のコメントごとにチェックしてください。

MERGEステートメント内では、ソース表とターゲット表の間のレコードの一致方法と、一致がある(または一致しない)場合のアクションを指定します。従って、INSERTがどのレコードであるかが、UPDATEであり、これはDELETE dであることを決定する。

上記のドキュメントページからの例を見てみましょう:ここ

MERGE Production.UnitMeasure AS target 
    USING (SELECT @UnitMeasureCode, @Name) AS source (UnitMeasureCode, Name) 
    ON (target.UnitMeasureCode = source.UnitMeasureCode) 
    WHEN MATCHED THEN 
     UPDATE SET Name = source.Name 
WHEN NOT MATCHED THEN 
    INSERT (UnitMeasureCode, Name) 
    VALUES (source.UnitMeasureCode, source.Name) 
    OUTPUT deleted.*, $action, inserted.* INTO #MyTempTable; 

を、彼らはtarget.UnitMeasureCode = source.UnitMeasureCodeにレコードをマッチングされ、マッチがある場合、彼らはソースからName値を持つ対象のレコードを更新します。一致するものがなければ、ソースレコードの値を使用して新しいレコードをターゲットテーブルに挿入します。

関連する問題