Если это то, что вы планируете делать регулярно (т. Е. Это часть логики приложения, а не одноразовое упражнение по преобразованию данных), то вы можете использовать представление Table1 и Table2 с INSTEAD OF INSERT
триггером для управления разделением данных (и организации ключи / отношения) - тогда вы просто сделаете:
INSERT newView SELECT NEWID(), A, B, C, D, E, F FROM MyTable
и триггер может быть таким простым:
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
при условии, что представление выглядит примерно так:
CREATE VIEW newView AS
SELECT table1.ID, A, B, C, D, E, F
FROM table1
JOIN table2 ON table1.ID = table2.ID;
или если в каждой таблице могут быть строки, не совпадающие в другой:
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;
(конечно, какие строки выводятся, когда вы SELECT
из представления неважны, если вы не собираетесь делать SELECT
это, и он существует только для предоставления шаблона INSERT
для триггера, чтобы он мог творить чудеса)
Это предполагает, что вы намереваетесь использовать тип UUID для вашего первичного ключа в этом случае - если вы используете автоматически увеличивающийся целочисленный ключ в таблице 1, вам нужно проделать еще немного работы. Может работать что-то вроде следующего:
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
и на самом деле эта пара INSERT
операторов может работать напрямую как одноразовая, например, так (используете ли вы ключ INT IDENTITY
или UNIQUEIDENTIFIER DEFAULT NEWID()
тип для ключа):
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;
полностью исключая необходимость в представлении и триггере, хотя, если вы будете часто выполнять эту операцию в своем коде, триггер view + все равно стоит рассмотреть, чтобы абстрагироваться от необходимости использовать несколько операторов каждый раз.
ПРЕДУПРЕЖДЕНИЕ: все вышеперечисленные SQL были набраны с мыслью и не проверены, он должен работать, прежде чем есть какая-либо гарантия того, что он будет работать так, как вам нужно.