Если это то, что вы планируете делать регулярно (т. Е. Это часть логики приложения, а не одноразовое упражнение по преобразованию данных), то вы можете использовать представление 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 были набраны с мыслью и не проверены, он должен работать, прежде чем есть какая-либо гарантия того, что он будет работать так, как вам нужно.
После прочтения вашего вопроса и комментариев к другим ответам кажется, что вы пытаетесь решить проблему
DataTable
, разделив ее на две новые таблицы.Я предполагаю,
DataTable
что уже нет единственного уникального поля, такого какIDENTITY(1,1)
? Если нет, возможно, вам следует добавить тот, который вы могли бы использовать для вставки данных вTable1
иTable2
.В качестве примера; Я создал образец схемы, вставил в нее тестовые данные
DataTable
, изменил столбец, затем использовал его для вставки данных в оба и :DataTable
IDENTITY(1,1)
Table1
Table2
источник
Эта вещь сработала для меня, я знаю ее очень поздний ответ, но может помочь другим. Я использовал
IDENT_CURRENT
получить идентификатор строки из предыдущей вставки, но для меня это всегда одна строка.источник