web-dev-qa-db-ja.com

複数のWHEN MATCHEDステートメントを使用する場合、それらはすべて実行されますか、それとも1つだけが実行されますか?

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があるかどうかは気になります。

19
Codeman

あなたの質問に答えるために、はい、それは単一のマッチだけを実行し、それからブレークします。ただし、更新で条件付きマッチングを可能にするロジックが必要な場合は、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
17
sgeddes

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が必要です。

18
Codeman

ええ、答えは、本当にそうしますか。行セットの場合のように、遅い行の更新に苦労して行ベースの更新を行に変更する場合、レコードごとにどの列が変更されたのか実際にはわからないためです。 。

したがって、問題はパフォーマンスを得たいですか?もしそうなら、それをカバーするインデックスがあることを確認してください

WHEN MATCHED TARGET.FIELD1 = SOURCE:FIELD1 AND TARGET.FIELD2 = SOURCE:FIELD2 ... 

そうでない場合は、マージ後にINSTEAD OFトリガーを使用して更新にカーソルを合わせる必要があります...

ただし、速度は良くありませんが、だれが何をしたかを記録する必要がある場合は機能します...

ハッピーコーディング

ウォルター

1