Zusammenführen von Abfrage in SQL server 2008

Ich habe das Szenario, die data von der Quellentabelle auf die Zieltabelle zu laden. Wenn die data aus der Quelle nicht im Ziel vorhanden sind, dann muss ich insert. Wenn es bereits in der Zieltabelle vorhanden ist, dann aktualisieren Sie den Status der Zeile auf 'ablaufen' und fügen Sie die Spalte als neue Zeile ein. Ich habe Merge-Abfrage verwendet, um dies zu tun. Ich kann insert, wenn nicht existiert und ich kann auch aktualisieren. Aber beim Versuch, einzufügen, wenn Matched, heißt es Insert nicht erlaubt in 'when matched' Klausel. Bitte helfen Sie mir .. Vielen Dank im Voraus

Wenn Sie mehrere Aktionen für eine einzelne Zeile von Quelldaten ausführen möchten, müssen Sie diese Zeile irgendwie duplizieren.

Etwas wie das folgende (machen Tabellennamen, etc.):

;WITH Source as ( SELECT Col1,Col2,Col3,t.Dupl FROM SourceTable,(select 0 union all select 1) t(Dupl) ) MERGE INTO Target t USING Source s ON t.Col1 = s.Col1 and s.Dupl=0 /* Key columns here */ WHEN MATCHED THEN UPDATE SET Expired = 1 WHEN NOT MATCHED AND s.Dupl=1 THEN INSERT (Col1,Col2,Col3) VALUES (s.Col1,s.Col2,s.Col3); 

Sie wollen immer die s.Dupl-Bedingung im nicht abgestimmten Zweig, da sonst Quellzeilen, die keine Zielzeilen entsprechen, zweimal eingefügt werden.


Von dem Beispiel, das du als Kommentar geschrieben hast, würde ich mich ändern:

 MERGE target AS tar USING source AS src ON src.id = tar.id WHEN MATCHED THEN UPDATE SET D_VALID_TO=@nowdate-1, C_IS_ACTIVE='N', D_LAST_UPDATED_DATE=@nowdate WHEN NOT MATCHED THEN INSERT (col1,col2,col3) VALUES (tar.col1,tar.col2,tar.col3); 

in:

 ;WITH SourceDupl AS ( SELECT id,col1,col2,col3,t.Dupl FROM source,(select 0 union all select 1) t(Dupl) ) MERGE target AS tar USING SourceDupl as src on src.id = tar.id AND Dupl=0 WHEN MATCHED THEN UPDATE SET D_VALID_TO=@nowdate-1, C_IS_ACTIVE='N', D_LAST_UPDATED_DATE=@nowdate WHEN NOT MATCHED AND Dupl=1 THEN INSERT (col1,col2,col3) VALUES (src.col1,src.col2,src.col3); 

Ich habe die Werte in der VALUES Klausel VALUES , da in einem NICHT MATCHED-Zweig die Teertabelle keine Zeile hat, um Werte auszuwählen.

Schauen Sie sich eines dieser vielen Links an:

  • Verwenden Sie die MERGE-statement von SQL server 2008
  • MERGE auf Technet
  • Einführung in die MERGE-statement
  • SQL server 2008 MERGE

Ohne zu wissen, wie Ihre databasetabellen aussehen, können wir nicht mehr helfen – Sie müssen diese Artikel lesen und herausfinden, wie Sie diese auf Ihre konkrete Situation anwenden können.