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