MERGE combina a lógica INSERT, UPDATE e DELETE em uma instrução DML e, portanto, é atômica. Se você estiver fazendo UPSERTS de linha única, as vantagens serão menos óbvias. Por exemplo, uma implementação ingênua de um UPSERT pode ter a seguinte aparência:
IF EXISTS (SELECT * FROM t1 where [email protected])
UPDATE t1 SET ... WHERE [email protected]
ELSE
INSERT INTO t1 (...) VALUES (...)
No entanto, sem envolver isso em uma transação, é possível que a linha que vamos atualizar seja excluída entre o SELECT e o UPDATE. Adicionar lógica mínima para resolver esse problema nos dá isso:
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
Essa lógica não é necessária com a instrução MERGE.
Não há comparações que devam ser feitas entre CURSORS e a instrução MERGE.