Se questo è qualcosa che stai pianificando di fare regolarmente (ovvero fa parte della logica dell'applicazione e non un esercizio di trasformazione dei dati una tantum), puoi utilizzare una vista su Table1 e Table2 con un INSTEAD OF INSERT
trigger per gestire la suddivisione dei dati (e l'organizzazione le chiavi / relazioni) - allora dovresti semplicemente fare:
INSERT newView SELECT NEWID(), A, B, C, D, E, F FROM MyTable
e il trigger potrebbe essere semplice come:
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
supponendo che la vista sia simile a:
CREATE VIEW newView AS
SELECT table1.ID, A, B, C, D, E, F
FROM table1
JOIN table2 ON table1.ID = table2.ID;
o se potrebbero esserci righe in ciascuna tabella senza corrispondere alle righe nell'altra:
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;
(ovviamente quali righe vengono emesse quando SELECT
dalla vista non è importante se non si intende SELECT
da esso ed esiste solo per fornire un modello INSERT
in cui il trigger deve fare la sua magia)
Ciò presuppone che tu intenda utilizzare un tipo UUID per la tua chiave primaria in questo caso - se stai usando una chiave intera a incremento automatico sulla tabella1, c'è ancora un po 'di lavoro da fare. Qualcosa di simile al seguente potrebbe funzionare:
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
e in effetti quella coppia di INSERT
istruzioni potrebbe funzionare direttamente come una tantum in questo modo (sia che tu stia usando un INT IDENTITY
o UNIQUEIDENTIFIER DEFAULT NEWID()
tipo per la chiave):
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;
negando la necessità della vista e del trigger completamente, sebbene se questa è un'operazione che eseguirai spesso nel tuo codice, la vista + trigger varrebbe comunque la pena considerare di sottrarre la necessità di più istruzioni ogni volta.
CAVEAT: tutto l'SQL sopra è stato digitato dal pensiero e non testato, avrà bisogno di lavoro prima che ci sia la garanzia che funzionerà di cui hai bisogno.