如果我在MERGE语句中有多个WHEN MATCHED语句,如果它们是真的,它们都会执行吗?
我的例子:
DECLARE @X bit = NULL;
--skipping the MERGE statement, straight to WHEN MATCHED
WHEN MATCHED AND A = 1
@X = 0;
WHEN MATCHED AND B = 1
@X = 1;
4种可能性中X的状态是什么?
A|B|X
0|0|?
0|1|?
1|0|?
1|1|?
基本上,我很好奇每个WHEN MATCHED条款后是否有隐含的BREAK。
答案 0 :(得分:18)
我在MSDN documentation找到了
匹配时
指定target_table的所有行与ON返回的行匹配,并满足任何其他搜索条件,根据该子句更新或删除。
MERGE语句最多可以有两个WHEN MATCHED子句。如果指定了两个子句,则第一个子句必须附带AND子句。对于任何给定的行,仅当第一个不是时才应用第二个WHEN MATCHED子句。如果有两个WHEN MATCHED子句,则必须指定UPDATE操作,并且必须指定DELETE操作。如果在子句中指定了UPDATE,并且多个匹配的行与target_table中的行匹配,则SQL Server会返回错误。 MERGE语句不能多次更新同一行,也不能更新和删除同一行。
所以看起来只有一个语句被执行,并且它们需要一个DELETE而另一个需要UPDATE。
答案 1 :(得分:15)
要回答你的问题,是的,它只会运行一个匹配然后中断。但是,如果您希望在更新中允许条件匹配的逻辑,CASE
语句对此非常有用。
像这样的例子:
MERGE INTO YourTable
USING (VALUES (1, 1, NULL), (0, 0, NULL), (0, 1, NULL), (1, 0, NULL))
T2 (a2,b2,c2)
ON a = a2 AND b = b2
WHEN MATCHED THEN
UPDATE SET c =
CASE
WHEN a = 1 THEN 0
WHEN b = 1 THEN 1
ELSE NULL
END
WHEN NOT MATCHED THEN
INSERT (a, b) VALUES (a2, b2);
SELECT * FROM YourTable ORDER BY a,b;
结果:
A B C
--------------
0 0 (null)
0 1 1
1 0 0
1 1 0