単純に IF EXISTS を使用する場合と比較して、MERGE の利点は何かを知りたいです。推奨されるアプローチはどれですか? MERGE は行ごとの一致条件の更新と挿入を実行しますか? はいの場合、カーソルに似ていますか?
2 に答える
MERGE は、INSERT、UPDATE、および DELETE ロジックを 1 つの DML ステートメントに結合するため、アトミックです。単一行の UPSERTS を実行している場合、利点はあまり明白ではありません。たとえば、UPSERT の単純な実装は次のようになります。
IF EXISTS (SELECT * FROM t1 where id=@id)
UPDATE t1 SET ... WHERE id=@id
ELSE
INSERT INTO t1 (...) VALUES (...)
ただし、これをトランザクションでラップしないと、更新しようとしている行が SELECT と UPDATE の間で削除される可能性があります。その問題に対処するための最小限のロジックを追加すると、次のようになります。
BEGIN TRAN
IF EXISTS (SELECT * FROM t1 WITH (HOLDLOCK, UPDLOCK) where id=@id )
UPDATE t1 SET ... WHERE id=@id
ELSE
INSERT INTO t1 (...) VALUES (...)
COMMIT
このロジックは、MERGE ステートメントでは必要ありません。
CURSORS と MERGE ステートメントの間で行うべき比較はありません。
Merge では、ソース テーブルと一致するターゲット テーブルのデータを更新、挿入、および削除するオプションが提供されます。これはセットベースの操作であるため、カーソルとは異なります (行ごと)
「IF EXISTS」よりも優れているとはどういう意味かわかりませんが、マージは2つのテーブルを同期する便利で柔軟な方法です
これはマージに役立つリソースですhttps://www.simple-talk.com/sql/learn-sql-server/the-merge-statement-in-sql-server-2008/