MERGE combine les logiques INSERT, UPDATE et DELETE en une seule instruction DML, et est donc atomique. Si vous faites des UPSERTS à une seule rangée, les avantages sont moins évidents. Par exemple, une implémentation naïve d'un UPSERT peut ressembler à ceci :
IF EXISTS (SELECT * FROM t1 where [email protected])
UPDATE t1 SET ... WHERE [email protected]
ELSE
INSERT INTO t1 (...) VALUES (...)
Cependant, sans encapsuler cela dans une transaction, il est possible que la ligne que nous allons mettre à jour soit supprimée entre le SELECT et le UPDATE. L'ajout d'un minimum de logique pour résoudre ce problème nous donne ceci :
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
Cette logique n'est pas nécessaire avec l'instruction MERGE.
Aucune comparaison ne doit être établie entre CURSORS et l'instruction MERGE.