2016-06-27 7 views
0

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.

+0

Verwenden '@ SourceTable' selbst dann oder' @Table UNION @ SourceTable' für Zeilen, die in 'nicht existieren @ Table'. –

Antwort

0
  1. Es wäre am besten, IF @@ROWCOUNT > 0 Bedingung für den Rest des Skripts hinzufügen und einfach überspringen, wenn keine Datensätze aktualisiert wurde.

  2. Wenn egal, was alle Datensätze aus @SourceTable in Target Tabelle aktualisiert wurde die Verarbeitung verlangen weiter könnte es am besten sein, nur @SourceTable statt OUTPUT Klausel verwenden. Keine Daten in Ihrer MERGE-Anweisung sind OUTPUT aus der Target Tabelle.

  3. Wenn Sie möchten, dass Datensätze filtern aus @SourceTable in OUTPUT Klausel auch dann, wenn kein Update auf Target Tabelle erforderlich ist, können Sie „Dummy-Update“ auf den Aufzeichnungen durchführen, selbst wenn keine Werte tatsächlich ändern würde:


DECLARE @Table (ColA int, ColB int, ID int) 
INSERT @Table 
SELECT changes.ColA,changes.ColB,Changes.Identity 
FROM (MERGE Target 
USING (SELECT * FROM @SourceTable) SOURCE 
ON Target.ID=Source.ID 
WHEN MATCHED /* AND target.ColA<>soruce.ColA or target.ColB<>source.ColB    */ 
      /* Remove condition and update even when no value would actually change */ 
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) 
0

Sie können unmodifizierte Quelldatensätze erfassen, indem die OUTPUT der Merge-Anweisung zu erfassen. Sie benötigen ein Dummy-Update vorstellen:

DECLARE @dummy INT = 0; 
MERGE ... 
    WHEN MATCHED THEN 
    UPDATE @dummy = @dummy 
... 
    OUTPUT INSERTED.ColA,INSERTED.ColB,SOURCE.Identity