使用虚拟USING表减少MERGE?

时间:2016-03-15 00:07:32

标签: sql-server tsql merge

我正在创建一些专门用于从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这种用法的任何可靠理由吗?

1 个答案:

答案 0 :(得分:0)

您可以使用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