MERGEは、INSERT、UPDATE、およびDELETEロジックを1つのDMLステートメントに結合するため、アトミックです。単一行のUPSERTSを実行している場合、利点はそれほど明白ではありません。たとえば、UPSERTの単純な実装は次のようになります。
IF EXISTS (SELECT * FROM t1 where [email protected])
UPDATE t1 SET ... WHERE [email protected]
ELSE
INSERT INTO t1 (...) VALUES (...)
ただし、これをトランザクションでラップしないと、更新する行がSELECTとUPDATEの間で削除される可能性があります。その問題に対処するために最小限のロジックを追加すると、次のようになります。
BEGIN TRAN
IF EXISTS (SELECT * FROM t1 WITH (HOLDLOCK, UPDLOCK) where [email protected] )
UPDATE t1 SET ... WHERE [email protected]
ELSE
INSERT INTO t1 (...) VALUES (...)
COMMIT
このロジックは、MERGEステートメントでは必要ありません。
CURSORSとMERGEステートメントの間に比較する必要のある比較はありません。