Wenn Sie dies regelmäßig planen (dh es ist Teil der Anwendungslogik und keine einmalige Datentransformationsübung), können Sie eine Ansicht auf Tabelle1 und Tabelle2 mit einem INSTEAD OF INSERT
Auslöser verwenden, um die Aufteilung der Daten (und die Anordnung) zu verwalten die Schlüssel / Beziehungen) - dann würden Sie einfach tun:
INSERT newView SELECT NEWID(), A, B, C, D, E, F FROM MyTable
und der Auslöser könnte so einfach sein wie:
CREATE trg_newview_insert TRIGGER newView INSTEAD OF UPDATE AS
INSERT table1 SELECT ID, A, B, C FROM inserted
INSERT table2 SELECT ID, D, E, F FROM inserted
GO
Angenommen, die Ansicht ist so etwas wie:
CREATE VIEW newView AS
SELECT table1.ID, A, B, C, D, E, F
FROM table1
JOIN table2 ON table1.ID = table2.ID;
oder wenn es in jeder Tabelle Zeilen geben könnte, ohne dass die Zeilen in der anderen übereinstimmen:
CREATE VIEW newView AS
SELECT ISNULL(table1.ID, table2.ID), A, B, C, D, E, F
FROM table1
FULL OUTER JOIN table2 ON table1.ID = table2.ID;
(Natürlich SELECT
ist es unwichtig, welche Zeilen in der Ansicht ausgegeben werden, wenn Sie dies nicht beabsichtigen, SELECT
und es gibt nur eine Vorlage, INSERT
in die der Trigger seine Magie ausführen kann.)
Dies setzt voraus, dass Sie in diesem Fall einen UUID-Typ für Ihren Primärschlüssel verwenden möchten. Wenn Sie einen automatisch inkrementierenden Ganzzahlschlüssel in Tabelle 1 verwenden, ist etwas mehr Arbeit zu erledigen. So etwas könnte funktionieren:
CREATE trg_newview_insert TRIGGER newView INSTEAD OF UPDATE AS
INSERT table1 (A, B, C)
SELECT A, B, C
FROM inserted;
INSERT table2 (ID, D, E, F)
SELECT ID, D, E, F
FROM table1 AS t
JOIN inserted AS i ON t.A = i.A AND t.B = i.B AND t.C = i.C;
GO
und in der Tat könnte dieses INSERT
Anweisungspaar direkt als einmalig funktionieren (unabhängig davon, ob Sie einen INT IDENTITY
oder einen UNIQUEIDENTIFIER DEFAULT NEWID()
Typ für den Schlüssel verwenden):
INSERT table1 (A, B, C)
SELECT A, B, C
FROM MyTable;
INSERT table2 (ID, D, E, F)
SELECT ID, D, E, F
FROM table1 AS t
JOIN MyTable AS i ON t.A = i.A AND t.B = i.B AND t.C = i.C;
Wenn dies eine Operation ist, die Sie häufig in Ihrem Code ausführen, ist es dennoch erwägenswert, die Notwendigkeit mehrerer Anweisungen jedes Mal zu abstrahieren, um die Notwendigkeit mehrerer Anweisungen zu abstrahieren.
CAVEAT: Alle oben genannten SQL-Dateien wurden aus Gedanken eingegeben und nicht getestet. Sie müssen erst bearbeitet werden, bevor garantiert wird, dass sie nach Bedarf funktionieren.
Nach dem Lesen Ihrer Frage und den Kommentaren zu den anderen Antworten scheint es, als würden Sie versuchen, ein Problem zu beheben,
DataTable
indem Sie es in zwei neue Tabellen aufteilen.Ich nehme an,
DataTable
hat noch kein einziges eindeutiges Feld wie einIDENTITY(1,1)
? Wenn nicht, sollten Sie vielleicht eine hinzufügen, die Sie zum Einfügen von Daten inTable1
und verwenden könnenTable2
.Als Beispiel; Ich habe ein Beispielschema erstellt, Testdaten eingefügt
DataTable
,DataTable
in eineIDENTITY(1,1)
Spalte geändert und dieses dann zum Einfügen von Daten in beideTable1
undTable2
:quelle
Dieses Ding hat bei mir funktioniert, ich kenne seine sehr späte Antwort, kann aber anderen helfen. Ich habe
IDENT_CURRENT
die Identität der Zeile aus der vorherigen Einfügung abgerufen, aber für mich ist es immer eine Zeile.quelle