2

単純に IF EXISTS を使用する場合と比較して、MERGE の利点は何かを知りたいです。推奨されるアプローチはどれですか? MERGE は行ごとの一致条件の更新と挿入を実行しますか? はいの場合、カーソルに似ていますか?

4

2 に答える 2

4

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 ステートメントの間で行うべき比較はありません。

于 2013-06-19T19:14:46.300 に答える
3

Merge では、ソース テーブルと一致するターゲット テーブルのデータを更新、挿入、および削除するオプションが提供されます。これはセットベースの操作であるため、カーソルとは異なります (行ごと)

「IF EXISTS」よりも優れているとはどういう意味かわかりませんが、マージは2つのテーブルを同期する便利で柔軟な方法です

これはマージに役立つリソースですhttps://www.simple-talk.com/sql/learn-sql-server/the-merge-statement-in-sql-server-2008/

于 2013-06-19T19:03:23.797 に答える