Jeśli jest to coś, co planujesz robić regularnie (tj. Jest to część logiki aplikacji, a nie jednorazowe ćwiczenie transformacji danych), możesz użyć widoku do tabeli 1 i tabeli 2 z INSTEAD OF INSERT
wyzwalaczem do zarządzania dzieleniem danych (i aranżacją klucze / relacje) - wtedy po prostu zrobiłbyś:
INSERT newView SELECT NEWID(), A, B, C, D, E, F FROM MyTable
a wyzwalacz może być tak prosty, jak:
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
zakładając, że widok jest podobny do:
CREATE VIEW newView AS
SELECT table1.ID, A, B, C, D, E, F
FROM table1
JOIN table2 ON table1.ID = table2.ID;
lub jeśli w każdej tabeli mogą znajdować się wiersze bez pasujących wierszy w drugiej:
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;
(oczywiście co rzędy są wysyłane, gdy SELECT
z punktu widzenia nie ma znaczenia, jeśli nie zamierza SELECT
z niego i to tylko istnieje, aby zapewnić szablon INSERT
do za spust, aby zrobić swoją magię)
Zakłada się, że w tym przypadku zamierzasz użyć typu UUID dla klucza podstawowego - jeśli używasz automatycznie zwiększającego klucza liczby całkowitej w tabeli 1, jest trochę więcej do zrobienia. Może działać coś takiego:
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
i w rzeczywistości para INSERT
instrukcji może działać bezpośrednio jako taka jednorazowa (niezależnie od tego, czy używasz klawisza INT IDENTITY
lub UNIQUEIDENTIFIER DEFAULT NEWID()
typu dla klucza):
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;
całkowicie eliminując potrzebę widoku i wyzwalacza, chociaż jeśli jest to operacja, którą często będziesz wykonywać w kodzie, warto zobaczyć + wyzwalacz, aby za każdym razem wyodrębnić potrzebę wielu instrukcji.
CAVEAT: cały powyższy SQL został napisany z przemyślenia i nie został przetestowany, będzie potrzebował pracy, zanim będzie jakakolwiek gwarancja, że będzie działał tak, jak potrzebujesz.