Jika ini adalah sesuatu yang Anda rencanakan untuk dilakukan secara teratur (yaitu itu adalah bagian dari logika aplikasi dan bukan latihan transformasi data satu kali) maka Anda dapat menggunakan tampilan pada Table1 dan Table2 dengan INSTEAD OF INSERT
pemicu untuk mengelola pemisahan data (dan mengatur kunci / hubungan) - maka Anda cukup melakukan:
INSERT newView SELECT NEWID(), A, B, C, D, E, F FROM MyTable
dan pemicunya bisa sesederhana:
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
dengan asumsi tampilan adalah seperti:
CREATE VIEW newView AS
SELECT table1.ID, A, B, C, D, E, F
FROM table1
JOIN table2 ON table1.ID = table2.ID;
atau jika mungkin ada baris di setiap tabel tanpa baris yang cocok di yang lain:
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;
(tentu saja apa baris yang dihasilkan ketika Anda SELECT
dari tampilan tidak penting jika Anda tidak berniat SELECT
darinya dan itu hanya ada untuk menyediakan templat ke INSERT
dalam sebagai pemicu untuk melakukan keajaibannya)
Ini dengan asumsi bahwa Anda berniat untuk menggunakan jenis UUID untuk kunci utama Anda dalam kasus ini - jika Anda menggunakan kunci integer yang bertambah secara otomatis pada table1, ada sedikit pekerjaan yang harus dilakukan. Sesuatu seperti yang berikut ini mungkin berfungsi:
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
dan pada kenyataannya bahwa sepasang INSERT
pernyataan dapat bekerja secara langsung sebagai satu kali seperti itu (apakah Anda menggunakan INT IDENTITY
atau UNIQUEIDENTIFIER DEFAULT NEWID()
mengetik untuk kunci):
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;
meniadakan perlunya tampilan dan pemicu sepenuhnya, meskipun jika ini adalah operasi Anda akan sering melakukan dalam kode Anda tampilan + pemicu masih layak dipertimbangkan untuk mengabstraksi kebutuhan untuk beberapa pernyataan setiap kali.
CAVEAT: semua SQL di atas telah diketik dari pikiran dan tidak diuji, itu akan perlu bekerja sebelum ada jaminan itu akan berfungsi seperti yang Anda butuhkan.
Dari membaca pertanyaan Anda, dan komentar pada jawaban lain, sepertinya Anda mencoba untuk memperbaiki masalah dengan
DataTable
memecahnya menjadi dua tabel baru.Saya berasumsi
DataTable
belum memiliki satu bidang unik sepertiIDENTITY(1,1)
? Jika tidak, mungkin Anda harus menambahkan satu yang dapat Anda gunakan untuk memasukkan data keTable1
danTable2
.Sebagai contoh; Saya telah membuat skema sampel, memasukkan data uji
DataTable
, dimodifikasiDataTable
untuk memilikiIDENTITY(1,1)
kolom, kemudian menggunakannya untuk memasukkan data ke dalam keduanyaTable1
danTable2
:sumber
Hal ini bekerja untuk saya, saya tahu jawabannya sangat terlambat tetapi dapat membantu orang lain. Saya dulu
IDENT_CURRENT
mendapatkan identitas baris dari insert sebelumnya, tetapi bagi saya itu selalu satu baris.sumber