it-swarm.com.de

Werden bei der Verwendung mehrerer WHEN MATCHED-Anweisungen alle ausgeführt, oder wird nur eine ausgeführt?

Wenn ich in einer MERGE-Anweisung mehrere WHEN MATCHED-Anweisungen habe, werden sie alle ausgeführt, wenn sie wahr sind?

Mein Beispiel:

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;

Wie ist der Zustand von X in jeder der 4 Möglichkeiten?

A|B|X
0|0|?
0|1|?
1|0|?
1|1|?

Grundsätzlich bin ich neugierig, ob es nach jeder WHEN MATCHED-Klausel einen impliziten BREAK gibt.

17
Codeman

Um Ihre Frage zu beantworten, ja, es wird nur ein einziges Spiel ausgeführt und dann unterbrochen. Wenn Sie jedoch eine Logik haben möchten, die eine bedingte Übereinstimmung in der Aktualisierung zulässt, ist die CASE-Anweisung dafür ziemlich nützlich.

So etwas wie ein Beispiel:

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;

Und die Ergebnisse:

A   B   C
--------------
0   0   (null)
0   1   1
1   0   0
1   1   0
13
sgeddes

Ich habe in der MSDN-Dokumentation gefunden :

WENN PASSEN? 

Gibt an, dass alle Zeilen von target_table, die mit den von ON zurückgegebenen Zeilen übereinstimmen und zusätzliche Suchbedingungen erfüllen, entweder gemäß der Klausel aktualisiert oder gelöscht werden.

Die MERGE-Anweisung kann höchstens zwei WHEN MATCHED-Klauseln enthalten. Wenn zwei Klauseln angegeben werden, muss die erste Klausel von einer AND-Klausel begleitet werden. Für eine bestimmte Zeile wird die zweite WHEN MATCHED-Klausel nur angewendet, wenn die erste nicht gilt. Wenn zwei WHEN MATCHED-Klauseln vorhanden sind, muss eine UPDATE-Aktion und eine DELETE-Aktion angegeben werden. Wenn in der Klausel UPDATE angegeben ist und mehr als eine Zeile mit einer Zeile in target_table basiert, auf der basiert, gibt SQL Server einen Fehler zurück. Die MERGE-Anweisung kann dieselbe Zeile nicht mehrmals aktualisieren oder dieselbe Zeile aktualisieren und löschen.

Es sieht also so aus, als würde nur eine der Anweisungen ausgeführt, und sie erfordern ein DELETE in der einen und ein UPDATE in der anderen.

18
Codeman

nun, die Antwort lautet: Wollen Sie wirklich, denn wenn Sie eine satzbasierte Aktualisierung in eine Zeile ändern, indem Sie eine langsame Zeilenaktualisierung wie in einer Reihe von Zeilen durchführen, wissen Sie wirklich nicht, welche Spalten sich Datensatz für Datensatz geändert haben .

die Frage ist daher, ob Sie Leistung erzielen wollen. Wenn dies der Fall ist, stellen Sie sicher, dass Sie über Indizes verfügen, die den Index abdecken 

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

wenn nicht, müssen Sie nach dem Zusammenführen mit einem INSTEAD OF-Trigger über Ihre Aktualisierungen fahren ...

Nicht gut für die Geschwindigkeit, kann jedoch funktionieren, wenn Sie aufzeichnen müssen, wer was getan hat. 

Glückliche Kodierung

Walter

0