合并:效果的顺序

时间:2014-05-21 20:21:06

标签: sql-server tsql

我尝试使用MERGE命令插入和更新表格中的某些数据。该表上有一个唯一键,因此更新命令必须在插入之前运行,否则它将因违反唯一键而失败。此合并操作也发生在运行其他查询的事务的上下文中。

以下是查询的概要:

MERGE [dbo].[MyTable] AS Target
USING #temp AS Source ON Target.[id] = Source.[id]
WHEN MATCHED THEN 
  UPDATE ...
WHEN NOT MATCHED THEN 
  INSERT ...

我的问题是,当我运行查询时,它会为唯一键违规引发错误。我希望更新条款先运行,但它看起来不会发生。

任何人都可以确认执行的顺序吗?我能做些什么来解决这个问题吗?

1 个答案:

答案 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:)