我想知道与简单地使用 IF EXISTS 相比,MERGE 的优势是什么。建议的方法是什么?MERGE 是否执行逐行更新和插入匹配条件?如果是,它是否类似于光标?
问问题
8509 次
2 回答
4
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 语句之间不需要进行比较。
于 2013-06-19T19:14:46.300 回答
3
合并将为您提供更新、插入和删除目标表中与源表匹配的数据的选项。这是一个基于集合的操作,所以不像游标(逐行)
我不确定您所说的优于“如果存在”的优势是什么意思,但合并是同步 2 个表的有用且灵活的方式
这是合并https://www.simple-talk.com/sql/learn-sql-server/the-merge-statement-in-sql-server-2008/的有用资源
于 2013-06-19T19:03:23.797 回答