Romero
Aktiver Benutzer
- Beiträge
- 46
Hallo zusammen,
leider komm ich bei einer MERGE-Abfrage nicht weiter und ersuche eure Hilfe.
Dazu habe ich schon 2 Versuche (siehe unten) gestartet, wo entweder die TARGET-Zeile stehen bleibt, oder die Meldung kommt, dass die MERGE-Anweisung versucht hat, die TARGET-Zeile mehr als einmal zu aktualisieren /zu löschen.
Hier erstmal meine TARGET- / SOURCE-Tabellen (Kurzform):
TARGET
SOURCE
Endergebnis soll sein
Nun meine MERGE-Anweisung:
Versuch 1
Ergebnis
Versuch 2
Ergebnis
Die MERGE-Anweisung hat versucht, dieselbe Zeile mehr als einmal zu aktualisieren oder zu löschen. ...
Nun also die Frage: wie bekomme ich das obige Ergebnis hin, dass sowohl die "NULL"-TARGET-Zeile geupdatet wird, sowie die weitere SOURCE-Zeile geINSERT wird?
Oder müsste ich im Nachgang diese "NULL-TARGET-Zeile" separat löschen?
Sollte bereits die TARGET-Zeile entsprechend befüllt sein...
...dann funktioniert die UPDATE- als auch die INSERT-Funktion der MERGE-Anweisung (beide o.g. Versuche).
LG Romero
leider komm ich bei einer MERGE-Abfrage nicht weiter und ersuche eure Hilfe.
Dazu habe ich schon 2 Versuche (siehe unten) gestartet, wo entweder die TARGET-Zeile stehen bleibt, oder die Meldung kommt, dass die MERGE-Anweisung versucht hat, die TARGET-Zeile mehr als einmal zu aktualisieren /zu löschen.
Hier erstmal meine TARGET- / SOURCE-Tabellen (Kurzform):
TARGET
Auftrag | Arbeitsschritt | ID | Wert | Bemerkung |
80123456 | 0001 | NULL | NULL | NULL |
SOURCE
Auftrag | Arbeitsschritt | ID | Wert | Bemerkung |
80123456 | 0001 | ABC0001 | 20 | PAUSE |
80123456 | 0001 | ABC0002 | 30 | STOPP |
Endergebnis soll sein
Auftrag | Arbeitsschritt | ID | Wert | Bemerkung |
80123456 | 0001 | ABC0001 | 20 | PAUSE |
80123456 | 0001 | ABC0002 | 30 | STOPP |
Nun meine MERGE-Anweisung:
Versuch 1
SQL:
MERGE INTO [dbo].[Tabelle_1] AS TARGET
USING (SELECT Auftrag, Arbeitsschritt, Wert, Bemerkung) AS SOURCE
ON TARGET.[Auftrag] = SOURCE.[Auftrag] AND
TARGET.[Arbeitsschritt] = SOURCE.[Arbeitsschritt] AND
ISNULL(TARGET.[ID], '0') = ISNULL(SOURCE.[ID], '0')
WHEN MATCHED AND
ISNULL(TARGET.[ID], '0') <> SOURCE.[ID] OR
ISNULL(TARGET.[Wert], 0) <> SOURCE.[Wert] OR
ISNULL(TARGET.[Bemerkung], '') <> SOURCE.[Bemerkung]
THEN UPDATE
SET TARGET.[ID] <> SOURCE.[ID],
TARGET.[Wert] <> SOURCE.[Wert],
TARGET.[Bemerkung] <> SOURCE.[Bemerkung]
WHEN NOT MATCHED BY TARGET
THEN INSERT (Auftrag, Arbeitsschritt, ID, Wert, Bemerkung)
VALUES (SOURCE.[Auftrag], SOURCE.[Arbeitsschritt], SOURCE.[ID], SOURCE.[Wert], SOURCE.[Bemerkung])
;
Ergebnis
Auftrag | Arbeitsschritt | ID | Wert | Bemerkung |
80123456 | 0001 | NULL | NULL | NULL |
80123456 | 0001 | ABC0001 | 20 | PAUSE |
80123456 | 0001 | ABC0002 | 30 | STOPP |
Versuch 2
SQL:
MERGE INTO [dbo].[Tabelle_1] AS TARGET
USING (SELECT Auftrag, Arbeitsschritt, Wert, Bemerkung) AS SOURCE
ON TARGET.[Auftrag] = SOURCE.[Auftrag] AND
TARGET.[Arbeitsschritt] = SOURCE.[Arbeitsschritt] AND
CASE WHEN ISNULL(TARGET.[ID], '0') = '0' THEN 1
WHEN TARGET.[ID] = SOURCE.[ID] THEN 1
END = 1
WHEN MATCHED AND
ISNULL(TARGET.[ID], '0') <> SOURCE.[ID] OR
ISNULL(TARGET.[Wert], 0) <> SOURCE.[Wert] OR
ISNULL(TARGET.[Bemerkung], '') <> SOURCE.[Bemerkung]
THEN UPDATE
SET TARGET.[ID] <> SOURCE.[ID],
TARGET.[Wert] <> SOURCE.[Wert],
TARGET.[Bemerkung] <> SOURCE.[Bemerkung]
WHEN NOT MATCHED BY TARGET
THEN INSERT (Auftrag, Arbeitsschritt, ID, Wert, Bemerkung)
VALUES (SOURCE.[Auftrag], SOURCE.[Arbeitsschritt], SOURCE.[ID], SOURCE.[Wert], SOURCE.[Bemerkung])
;
Ergebnis
Die MERGE-Anweisung hat versucht, dieselbe Zeile mehr als einmal zu aktualisieren oder zu löschen. ...
Nun also die Frage: wie bekomme ich das obige Ergebnis hin, dass sowohl die "NULL"-TARGET-Zeile geupdatet wird, sowie die weitere SOURCE-Zeile geINSERT wird?
Oder müsste ich im Nachgang diese "NULL-TARGET-Zeile" separat löschen?
Sollte bereits die TARGET-Zeile entsprechend befüllt sein...
Auftrag | Arbeitsschritt | ID | Wert | Bemerkung |
80123456 | 0001 | ABC0001 | 40 | PAUSE |
LG Romero