如果您打算定期执行此操作(即它是应用程序逻辑的一部分,而不是一次性数据转换工作),则可以使用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类型用作主键-如果在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()
键的类型):
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 + trigger来每次都抽象出对多个语句的需求。
CAVEAT:以上所有SQL都是经过仔细考虑而输入的,未经测试,因此需要任何工作才能保证可以根据需要进行工作。