MERGEステートメントに複数のWHEN MATCHEDステートメントがある場合、それらがtrueであればすべて実行されますか?
私の例:
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があるかどうかは気になります。
あなたの質問に答えるために、はい、それは単一のマッチだけを実行し、それからブレークします。ただし、更新で条件付きマッチングを可能にするロジックが必要な場合は、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
MSDNドキュメント で見つかりました:
次に一致したとき
ONによって返された行と一致し、追加の検索条件を満たすすべてのtarget_tableの行が、句に従って更新または削除されることを指定します。
MERGEステートメントには、最大で2つのWHEN MATCHED句を含めることができます。 2つの句を指定する場合、最初の句にはAND句を付ける必要があります。特定の行について、2番目のWHEN MATCHED句は、最初の句が適用されていない場合にのみ適用されます。 2つのWHEN MATCHED句がある場合、1つはUPDATEアクションを指定し、もう1つはDELETEアクションを指定する必要があります。 UPDATEが句で指定され、複数の行がに基づくtarget_tableの行と一致する場合、SQL Serverはエラーを返します。 MERGEステートメントは、同じ行を複数回更新したり、同じ行を更新して削除したりすることはできません。
そのため、実行されるステートメントは1つだけであり、一方のステートメントではDELETE、もう一方のステートメントではUPDATEが必要です。
ええ、答えは、本当にそうしますか。行セットの場合のように、遅い行の更新に苦労して行ベースの更新を行に変更する場合、レコードごとにどの列が変更されたのか実際にはわからないためです。 。
したがって、問題はパフォーマンスを得たいですか?もしそうなら、それをカバーするインデックスがあることを確認してください
WHEN MATCHED TARGET.FIELD1 = SOURCE:FIELD1 AND TARGET.FIELD2 = SOURCE:FIELD2 ...
そうでない場合は、マージ後にINSTEAD OF
トリガーを使用して更新にカーソルを合わせる必要があります...
ただし、速度は良くありませんが、だれが何をしたかを記録する必要がある場合は機能します...
ハッピーコーディング
ウォルター