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.
Po przeczytaniu pytania i komentarzy do innych odpowiedzi wydaje się, że próbujesz rozwiązać problem
DataTable
, dzieląc je na dwie nowe tabele.Zakładam, że
DataTable
nie ma już pojedynczego pola unikatowego, takiego jakIDENTITY(1,1)
? Jeśli nie, być może powinieneś dodać taki, którego możesz użyć do wstawiania danych doTable1
iTable2
.Jako przykład; Został utworzony przykładowy schemat, włożonej do danych testowych
DataTable
, zmodyfikowanyDataTable
miećIDENTITY(1,1)
kolumny, które następnie wykorzystywane do wstawiania danych do obuTable1
iTable2
:źródło
To działało dla mnie, wiem, że jest to bardzo późna odpowiedź, ale może pomóc innym. Użyłem
IDENT_CURRENT
uzyskać tożsamość wiersza z poprzedniej wstawki, ale dla mnie zawsze jest to jeden wiersz.źródło