【发布时间】:2016-06-30 06:02:04
【问题描述】:
我正在创建一些专门用于从 C# 中使用的存储过程,以更新我们数据库中的各种表。大量项目需要一个可预测的函数:
1) 检查匹配的行是否已经存在 2)如果不存在,插入数据 3) 收集行ID并返回给用户
我知道这可以通过多种方式完成,但我能想象的最优雅的方式似乎是使用带有虚拟表的 MERGE 并使用 ON 子句的过程参数,例如:
CREATE PROCEDURE dbo.UpdatePerson(@PersonID INT, @FirstName VARCHAR(50)) AS
MERGE dbo.Person p
USING (SELECT 1 One) One
ON p.Person_ID = @PersonID
WHEN MATCHED THEN
UPDATE SET First_Name = @FirstName
WHEN NOT MATCHED THEN
INSERT (Person_ID, First_Name) VALUES (@PersonID, @FirstName);
即使我没有使用要合并的实际表,这也将它们全部包装在一个漂亮的包中。我知道可以通过以下方式实现相同的基本想法:
...
USING (SELECT @PersonID Person_ID, @FirstName First_Name) NewPerson
ON p.Person_ID = NewPerson.Person_ID
...
也许这会带来某种性能优势?
任何人都可以提供任何充分的理由来支持/反对这种 MERGE 的使用吗?
【问题讨论】:
-
据我了解,Merge 是“upsert”场景的集合操作。在您的存储过程中,ID 和名称是单独传入的。所以我认为这种模式没有比“IF EXISTS ELSE”模式更好的优势
-
只是感觉更简洁明了;有什么缺点吗?还是它们本质上可以互换?
标签: sql-server tsql merge