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

时间:2013-06-19 18:54:23

标签: sql-server sql-server-2008

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

2 个答案:

答案 0 :(得分: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 (...)

但是,如果不在事务中包装它,我们将要更新的行可能会在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

MERGE语句不需要此逻辑。

在CURSORS和MERGE声明之间没有比较。

答案 1 :(得分:3)

Merge将为您提供在源表中匹配的目标表中更新,插入和删除数据的选项。它是基于集合的操作,因此不像游标(逐行)

我不确定你对“IF EXISTS”的优势是什么意思,但合并是同步2个表的有用而灵活的方法

这是合并https://www.simple-talk.com/sql/learn-sql-server/the-merge-statement-in-sql-server-2008/

的有用资源