これが定期的に行う予定の場合(つまり、アプリケーションロジックの一部であり、1回限りのデータ変換演習ではない場合)、INSTEAD OF INSERT
トリガーを使用してTable1およびTable2へのビューを使用し、データの分割(および配置)を管理できます。キー/関係)-次に、あなたはただ行うでしょう:
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タイプを使用することを想定しています。table1で自動的に増分する整数キーを使用している場合は、もう少し作業が必要です。次のようなものが機能する可能性があります。
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()
タイプを使用しているかどうかにかかわらず)1回限りのように直接機能する可能性があります。
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;
ビューとトリガーの必要性を完全に否定しますが、これがコード内で頻繁に実行される操作である場合、ビューとトリガーは、毎回複数のステートメントの必要性を抽象化することを検討する価値があります。
警告:上記のSQLはすべて、思考から型付けされており、テストされていません。必要に応じて機能することが保証される前に、機能する必要があります。