MERGE kombinerer INSERT, UPDATE og DELETE logik i én DML-sætning og er derfor atomisk. Hvis du laver UPSERTS på en række, er fordelene mindre indlysende. For eksempel kan en naiv implementering af en UPSERT se ud som følger:
IF EXISTS (SELECT * FROM t1 where [email protected])
UPDATE t1 SET ... WHERE [email protected]
ELSE
INSERT INTO t1 (...) VALUES (...)
Men uden at pakke dette ind i en transaktion, er det muligt, at den række, vi skal opdatere, bliver slettet mellem SELECT og OPDATERING. Tilføjelse af minimal logik for at løse dette problem giver os dette:
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
Denne logik er ikke nødvendig med MERGE-sætningen.
Der er ingen sammenligninger, der skal drages mellem CURSORS og MERGE-sætningen.