Ich habe einige Änderungen an meiner Datenbank vorgenommen und muss die alten Daten in die neuen Tabellen migrieren. Dazu muss ich eine Tabelle (ReportOptions) aus den Originaltabellen (Practice) und eine zweite Zwischentabelle (PracticeReportOption) ausfüllen.
ReportOption (ReportOptionId int PK, field1, field2...)
Practice (PracticeId int PK, field1, field2...)
PracticeReportOption (PracticeReportOptionId int PK, PracticeId int FK, ReportOptionId int FK, field1, field2...)
Ich habe eine Abfrage durchgeführt, um alle Daten abzurufen, die ich zum Üben von Practice zu ReportOptions benötige, aber ich habe Probleme, die Zwischentabelle zu füllen
--Auxiliary tables
DECLARE @ReportOption TABLE (PracticeId int /*This field is not on the actual ReportOption table*/, field1, field2...)
DECLARE @PracticeReportOption TABLE (PracticeId int, ReportOptionId int, field1, field2)
--First I get all the data I need to move
INSERT INTO @ReportOption
SELECT P.practiceId, field1, field2...
FROM Practice P
--I insert it into the new table, but somehow I need to have the repation PracticeId / ReportOptionId
INSERT INTO ReportOption (field1, field2...)
OUTPUT @ReportOption.PracticeId, --> this is the field I don't know how to get
inserted.ReportOptionId
INTO @PracticeReportOption (PracticeId, ReportOptionId)
SELECT field1, field2
FROM @ReportOption
--This would insert the relationship, If I knew how to get it!
INSERT INTO @PracticeReportOption (PracticeId, ReportOptionId)
SELECT PracticeId, ReportOptionId
FROM @ReportOption
Wenn ich auf ein Feld verweisen könnte, das sich nicht in der Zieltabelle der OUTPUT-Klausel befindet, wäre das großartig (ich denke, ich kann nicht, aber ich weiß es nicht genau). Irgendwelche Ideen, wie ich meine Bedürfnisse erfüllen kann?
sql
sql-server
Alejandro B.
quelle
quelle
OUTPUT
Klausel jede der Spalten der Tabelle zurückgeben, in die Sie eine Zeile eingefügt haben . Selbst wenn Sie in IhrerINSERT
Anweisung keinen Wert für eine bestimmte Spalte angeben, können Sie diese Spalte dennoch in derOUTPUT
Klausel angeben . Sie können jedoch keine SQL-Variablen oder -Spalten aus anderen Tabellen zurückgeben.Antworten:
Sie können dies tun, indem Sie
MERGE
anstelle von Einfügen Folgendes verwenden:Also ersetze dies
mit
Der Schlüssel besteht darin, ein Prädikat zu verwenden, das in der Zusammenführungssuchbedingung niemals wahr ist (1 = 0). Sie führen also immer die Einfügung durch, haben jedoch Zugriff auf Felder sowohl in der Quell- als auch in der Zieltabelle.
Hier ist der gesamte Code, mit dem ich ihn getestet habe:
Weitere Lektüre und die Quelle von allem, was ich zu diesem Thema weiß, ist hier
quelle
Vielleicht findet jemand, der MS SQL Server 2005 oder niedriger verwendet , diese Antwort hilfreich.
MERGE funktioniert nur für SQL Server 2008 oder höher. Für den Rest habe ich eine andere Problemumgehung gefunden, mit der Sie Mapping-Tabellen erstellen können.
So sieht die Auflösung für SQL 2005 aus:
Der Haupttrick besteht darin, dass wir die Zuordnungstabelle zweimal mit geordneten Daten aus der Quell- und Zieltabelle füllen. Weitere Informationen finden Sie hier: Zusammenführen eingefügter Daten mit OUTPUT in SQL Server 2005
quelle
Output
meinenInsert
‚s mit einem AusgangTable
, der einen enthältIdentity
Wert von dem ZielTable
mit einem nichtInsert
-ed Wert (PK) von der QuelleTable
(btw, so konnte ich dann (in einer anderen Charge) verwenden , die AusgabeTable
eines bevölkernColumn
in die QuelleTable
mit demIdentity
Wert). Ohne aMerge
müsste ich wohl: a) startenTransaction
, b) als nächstes kommenIdentity
, c)Table
mit berechnet in temp einfügenIdentity
, d) setzenIdentity_Insert
, e) von tempInsert
in Ziel , f) löschen .Table
Table
Identity_Insert