我尝试使用MERGE
命令插入和更新表格中的某些数据。该表上有一个唯一键,因此更新命令必须在插入之前运行,否则它将因违反唯一键而失败。此合并操作也发生在运行其他查询的事务的上下文中。
以下是查询的概要:
MERGE [dbo].[MyTable] AS Target
USING #temp AS Source ON Target.[id] = Source.[id]
WHEN MATCHED THEN
UPDATE ...
WHEN NOT MATCHED THEN
INSERT ...
我的问题是,当我运行查询时,它会为唯一键违规引发错误。我希望更新条款先运行,但它看起来不会发生。
任何人都可以确认执行的顺序吗?我能做些什么来解决这个问题吗?
答案 0 :(得分:2)
避免使用Merge语句,我会使用两个单独的UPDATE和INSERT语句来执行这些操作,就像这样....
<强>更新强>
UPDATE MT
SET MT.Col1 = T.Col1
,MT.Col2 = T.Col2
,MT.Col3 = T.Col3
FROM [MyTable] MT INNER JOIN #temp t
ON MT.[id] = T.[id]
插入强>
INSERT INTO [MyTable] (ID, Col1, Col2, Col3)
SELECT t.ID, t.Col1, t.Col2, t.Col3
FROM #temp t
WHERE NOT EXISTS (SELECT 1
FROM [MyTable]
WHERE ID = t.ID)
为什么要避免合并
Aaron Bertrand Use Caution with SQL Server's MERGE Statement
阅读本文后,您将了解到这种违反Unique Key的行为实际上是Merge Statement中的Active bug。最好远离Merge:)