我开始研究一个已经运行了一些脚本的项目,当我查看一些已经完成的脚本时,我遇到了一个看起来像这样的场景。
DROP TABLE IF EXISTS #Persons
SELECT PersonId = 1, Firstname = 'Joaquin', LastName = 'Alvarez'
INTO #Persons
DECLARE @inserted table (PersonId INT, Firstname VARCHAR(50), Lastname VARCHAR(50))
MERGE INTO dbo.Persons P USING #Persons TP ON 1 = 0 -- Forcing mismatch
WHEN NOT MATCHED THEN
INSERT
(
PersonId,
Firstname,
Lastname
)
VALUES
(
TP.PersonId,
TP.Firstname,
TP.LastName
)
OUTPUT INSERTED.PersonId, INSERTED.Firstname, INSERTED.LastName
INTO @inserted;
Run Code Online (Sandbox Code Playgroud)
我的问题是为什么他们会使用合并并强制不匹配只是为了执行插入,如果没有它,他们可以用类似的东西做同样的事情。
DROP TABLE IF EXISTS #Persons
SELECT PersonId = 1, Firstname = 'Joaquin', LastName = 'Alvarez'
INTO #Persons
DECLARE @inserted table (PersonId INT, Firstname VARCHAR(50), Lastname VARCHAR(50))
INSERT INTO Persons
OUTPUT INSERTED.PersonId, INSERTED.Firstname, INSERTED.LastName
INTO @inserted
VALUES (1, 'Joaquin', 'Alvarez')
Run Code Online (Sandbox Code Playgroud)
第一个选项比最后一个更快?或者他们是相同的机器人?这是我第一次看到 merge into 以这种方式使用。
您确实需要询问编写代码的人。但我能想到两个半原因。
首先,原始代码既是一个INSERT,UPDATE也是作者用来MERGE处理代码的。随着代码被测试或需求发生变化,编写代码的人意识到UPDATE不需要 ,但保留了MERGE.
一半的原因是有人编写了代码,期望UPDATE随着时间的推移会需要 s,因此试图使代码面向未来。
第二个原因是,作者可能只是更喜欢MERGEs 而不是UPDATEs 和INSERTs,因为它是一个比其中任何一个单独的陈述都更强大的陈述。所以,他们只是总是使用MERGE.