Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Quais são as vantagens do MERGE sobre o simples IF EXISTS?


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.