Sql server 合并:效果顺序

Sql server 合并:效果顺序,sql-server,tsql,Sql Server,Tsql,我试图使用MERGE命令插入和更新表中的一些数据。该表上有一个唯一键,因此update命令必须在插入之前运行,否则它将由于违反唯一键而失败。此合并操作还发生在运行其他查询的事务上下文中 以下是该查询的概述: MERGE [dbo].[MyTable] AS Target USING #temp AS Source ON Target.[id] = Source.[id] WHEN MATCHED THEN UPDATE ... WHEN NOT MATCHED THEN INSERT

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

以下是该查询的概述:

MERGE [dbo].[MyTable] AS Target
USING #temp AS Source ON Target.[id] = Source.[id]
WHEN MATCHED THEN 
  UPDATE ...
WHEN NOT MATCHED THEN 
  INSERT ...
我的问题是,当我运行查询时,它会抛出一个唯一密钥冲突错误。我希望先运行update子句,但看起来没有


有人能确认执行顺序吗?如果我能做些什么来解决这个问题吗?

避免使用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)
为什么要避免合并

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]
阅读亚伦·伯特兰的这篇文章


阅读本文后,您将了解到这种违反Unique Key的行为实际上是Merge语句中的一个活动bug。最好远离合并:)

我假设顺序是源代码的任何顺序。您可以尝试在源代码存在时按
大小写排序(从[dbo].[MyTable]m中选择1,其中m.[id]=source.[id]),然后按0或1结束
,尽管我真的不知道SQL Server是否会在整个合并过程中遵守该顺序。也不确定它是否安全(这就是为什么这是一个评论,而不是一个答案)。