RKh*_*RKh 1 sql-server sql-server-2008
我想知道MERGE比简单地使用IF EXISTS有什么优势.建议的方法是哪种?MERGE是否执行更新和插入逐行匹配条件?如果是的话,它与游标类似吗?
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语句之间没有比较.
| 归档时间: |
|
| 查看次数: |
6752 次 |
| 最近记录: |