ich für eine MERGE-Klausel in diesem Format:T-SQL MERGE unverändert Ziel
DECLARE @Table (ColA int, ColB int, ID int)
INSERT @Table
SELECT changes.ColA,changes.ColB,Changes.Identity
FROM
(
MERGE Target
USING @SourceTable SOURCE
ON Target.ID=Source.ID
WHEN MATCHED AND target.ColA<>soruce.ColA or target.ColB<>source.ColB THEN
UPDATE SET
Target.ColA=source.ColA,
Target.ColB=source.ColB
WHEN NOT MATCHED BY TARGET
INSERT(ColA,ColB)
VALUES(Source.ColA,Source.ColB)
WHEN NOT MATCHED BY SOURCE THEN
DELETE
OUTPUT INSERTED.ColA,INSERTED.ColB,SOURCE.Identity
) AS changes(ColA,ColB,SOURCE.Identity)
ich dann die @Table
als Quelle verwenden, zusätzliche später beitritt. Wenn in der TARGET-Tabelle keine Einfügevorgänge/Aktualisierungen vorhanden sind, ist @Table
leer, was zu Problemen für den Rest der gesamten Abfrage führt, da kein JOIN-Vorgang ausgeführt wird.
Gibt es eine Möglichkeit, die SOURCE
Zeilen zu erfassen, auch wenn sie nicht auf der TARGET
Seite manipuliert werden?
Ich muss MERGE verwenden, um Identitätsspalten auf INSERT/UPDATES abzurufen.
Verwenden '@ SourceTable' selbst dann oder' @Table UNION @ SourceTable' für Zeilen, die in 'nicht existieren @ Table'. –