MERGE比简单的IF EXISTS有什么优势?

RKh*_*RKh 1 sql-server sql-server-2008

我想知道MERGE比简单地使用IF EXISTS有什么优势.建议的方法是哪种?MERGE是否执行更新和插入逐行匹配条件?如果是的话,它与游标类似吗?

Str*_*DBA 5

MERGE将INSERT,UPDATE和DELETE逻辑组合到一个DML语句中,因此是原子的.如果您正在进行单排UPSERTS,那么优势就不那么明显了.例如,UPSERT的简单实现可能如下所示:

IF  EXISTS (SELECT * FROM t1 where id=@id)
    UPDATE t1 SET ... WHERE id=@id
ELSE
    INSERT INTO t1 (...) VALUES (...)
Run Code Online (Sandbox Code Playgroud)

但是,如果不在事务中包装它,我们将要更新的行可能会在SELECT和UPDATE之间被删除.添加最小逻辑来解决该问题给我们:

BEGIN TRAN
IF  EXISTS (SELECT * FROM t1 WITH (HOLDLOCK, UPDLOCK) where id=@id )
    UPDATE t1 SET ... WHERE id=@id
ELSE
    INSERT INTO t1 (...) VALUES (...)
COMMIT
Run Code Online (Sandbox Code Playgroud)

MERGE语句不需要此逻辑.

CURSORS和MERGE语句之间没有比较.

  • 好吧,小心这个承诺:它只是具有特定提示或隔离级别的原子.默认情况下[它的行为类似于单独的语句](http://weblogs.sqlteam.com/dang/archive/2009/01/31/UPSERT-Race-Condition-With-MERGE.aspx). (6认同)