Theoretisch sollte es eine Lösung geben, dies in einer einzigen Anweisung zu tun, aber ich habe sie bisher nicht gefunden. *
Hier ist, wie es mit zwei MERGE
gemacht werden kann Anweisungen:
WITH CTE_trgt AS
(
SELECT c.compid, c.ownerid, t.projid, t.active
FROM component c
INNER JOIN trace t ON c.compid = t.compid
)
MERGE CTE_trgt t
USING Donor s
ON t.projid = s.projid
WHEN NOT MATCHED BY TARGET
THEN INSERT (ownerid)
VALUES (s.ownerid)
OUTPUT
INSERTED.compid, s.projid, 1 INTO trace;
MERGE trace t
USING Donor s
ON t.projid = s.projid
WHEN NOT MATCHED BY SOURCE
THEN UPDATE SET t.active = 0;
*Teil mit Aktualisierung der aktiven Spalte:
WHEN NOT MATCHED BY SOURCE
THEN UPDATE SET t.active = 0
sollte in der Lage sein, in die obere Abfrage zu passen und eine einzelne Merge-Anweisung zu erstellen für alle Operationen, aber es wird ein Fehler ausgegeben:
auch wenn es sich offensichtlich um eine einzige Spalte handelt und reguläre Aktualisierungen ohne Zusammenführung funktionieren . Vielleicht kennt jemand einen Grund und/oder einen Workaround dafür.