Nếu đây là việc bạn định làm thường xuyên (nghĩa là nó là một phần của logic ứng dụng chứ không phải là bài tập chuyển đổi dữ liệu một lần) thì bạn có thể sử dụng chế độ xem trên Bảng 1 và Bảng 2 với trình INSTEAD OF INSERT
kích hoạt để quản lý phân tách dữ liệu (và sắp xếp các khóa / mối quan hệ) - sau đó bạn sẽ làm:
INSERT newView SELECT NEWID(), A, B, C, D, E, F FROM MyTable
và kích hoạt có thể đơn giản như:
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
giả sử quan điểm là một cái gì đó như:
CREATE VIEW newView AS
SELECT table1.ID, A, B, C, D, E, F
FROM table1
JOIN table2 ON table1.ID = table2.ID;
hoặc nếu có thể có các hàng trong mỗi bảng mà không khớp các hàng trong bảng khác:
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;
(tất nhiên các hàng được xuất ra khi bạn SELECT
từ chế độ xem là không quan trọng nếu bạn không có ý định SELECT
từ nó và nó chỉ tồn tại để cung cấp một khuôn mẫu để INSERT
kích hoạt thực hiện phép thuật của nó)
Điều này giả định rằng bạn đang có ý định sử dụng loại UUID cho khóa chính của mình trong trường hợp này - nếu bạn đang sử dụng khóa số nguyên tự động tăng trên bảng1 thì sẽ còn nhiều việc phải làm. Một cái gì đó như sau có thể hoạt động:
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
và trên thực tế, cặp INSERT
câu lệnh có thể hoạt động trực tiếp như một lần như vậy (cho dù bạn đang sử dụng một INT IDENTITY
hoặc UNIQUEIDENTIFIER DEFAULT NEWID()
loại cho khóa):
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;
phủ nhận hoàn toàn nhu cầu về chế độ xem và kích hoạt, mặc dù nếu đây là thao tác bạn sẽ thực hiện thường xuyên trong mã của mình thì chế độ xem + kích hoạt vẫn đáng để xem xét để trừu tượng hóa nhu cầu cho nhiều câu lệnh mỗi lần.
CAVEAT: tất cả các SQL trên đã được nhập từ suy nghĩ và không được kiểm tra, nó sẽ cần làm việc trước khi có bất kỳ đảm bảo nào nó sẽ hoạt động như bạn cần.