【问题标题】:Downsides to MERGE with dummy USING table?与虚拟 USING 表合并的缺点?
【发布时间】: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


【解决方案1】:

您可以使用 if 条件来代替使用 MERGE。

你有一个临时表

CREATE TABLE #Table(PersonID INT,First_Name VARCHAR(100))

-- BEFORE THAT INSERT INTO TEMP TABLE 

IF EXISTS(SELECT 1 FROM YOURTABLE WHERE PERSONID IN(SELECT PERSONID FROM #TABLE)) 
BEGIN
    -------YOUR UPDATE QUERY
END 
ELSE
BEGIN
    -------INSERT QUERY
END

DROP TABLE #Table

【讨论】:

  • 我知道这是一种可能性,但它似乎更多的代码和不那么优雅。使用合并而不是这种方法有什么缺点吗?
猜你喜欢
  • 2016-02-14
  • 1970-01-01
  • 2020-10-14
  • 2019-06-06
  • 1970-01-01
  • 1970-01-01
  • 2020-01-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多