|
如果我在MERGE语句中有多个WHEN MATCHED语句,如果它们是真的,它们是否全部执行?
/ d& u+ A, K; g+ P9 V. ]我的例子:# P2 k7 g- k- X* q0 i
DECLARE @X bit = NULL;0 K# `$ y6 o1 B/ u: _& i# A
--skipping the MERGE statement, straight to WHEN MATCHED
' _4 n8 P3 y, nWHEN MATCHED AND A = 1
o4 x3 b, P. Q" V @X = 0;( ]% S B7 |( b7 F
WHEN MATCHED AND B = 1
& t+ t4 ^, b# l" K @X = 1;
/ r* ~: u' r* T* |+ ?在这四个可能性中,每个X的状态是什么?
* R! g4 @1 S% `3 A; g8 l+ Y, `6 S, [A|B|X7 k6 T: G4 V, U; U; C7 k6 v
0|0|?6 l/ H: y& t& |6 J6 s' r
0|1|?
6 m; t' e" o) g$ @, U; q6 ?1|0|?
1 K5 K9 e2 U6 `/ v) ~$ I& o1|1|?9 p3 ]2 U' n' C) L( G; }
基本上,我很好奇每个WHEN MATCHED子句之后是否存在隐式BREAK。
9 H+ w" |% m5 E5 z; c, t+ s" Z, m , @' j, z) T/ @8 |! o/ a
解决方案:" s+ d2 v j& S+ o/ A# Z% Y/ q
1 f$ [+ l1 W6 I% w' Y
. |5 Z# _/ \* K4 F6 d7 o
' x3 ]$ ?" ~6 T+ t4 ~5 S! r% `
要回答您的问题,是的,它将只进行一次比赛然后中断。但是,如果您希望逻辑允许在更新中进行条件匹配,则该CASE语句对此非常有用。
' G \5 J. c! B5 J" @像这样的例子:
: R! F. h2 d4 I# L. X1 ]8 ^MERGE INTO YourTable
0 X5 o5 \1 E1 u& T) uUSING (VALUES (1, 1, NULL), (0, 0, NULL), (0, 1, NULL), (1, 0, NULL))
& Q% q3 V+ p" h9 c+ G2 I f- N T2 (a2,b2,c2)
( Q% y* ?9 _9 X0 g* X- {ON a = a2 AND b = b2" O3 D! z3 C% ?: e, W
WHEN MATCHED THEN+ J1 i9 d1 e. N" p
UPDATE SET c = / ~+ T3 H0 N1 u
CASE
$ c: S4 j w2 A8 ~" S WHEN a = 1 THEN 08 F: c; D d% P6 q5 u" K
WHEN b = 1 THEN 1
+ }0 z) \5 J+ q& o- I ELSE NULL
( T( Z$ W9 M c( S5 C END
n* w- K2 X, V7 L1 e2 ^, _WHEN NOT MATCHED THEN
1 Z0 r+ E' y; B9 G/ O INSERT (a, b) VALUES (a2, b2);; l" n- n3 N3 O/ v
SELECT * FROM YourTable ORDER BY a,b;$ q& T) \& D8 l, i8 d0 |2 m A& v
SQL小提琴演示. e( F1 z& A" I B3 _ A t
+ J7 Z$ O, r, z6 d7 F9 M
结果:3 Z' C" @2 w" q7 ?# O
A B C0 U0 s+ h& Y: W, s0 N
--------------' d' X4 N( u* J! Z: A
0 0 (null)
( H+ ^5 [6 m" e0 1 1
: l, T* T& f, @ m* J/ o) y0 f1 0 01 S8 q1 y7 ?+ N; F2 E* Y- Q) q
1 1 0 |
|