我想在SQL中复制一行,其中包含2个其他表中的子记录。如果主记录重复,我想复制它们。
例如,如果我说我想将id为15的主记录复制到新记录中。我希望所有的子记录都与新的主记录ID重复。可以通过TSQL使用循环和条件来完成。但我只是想知道是否有更好的选择。
感谢。
答案 0 :(得分:1)
最好的选择是在主表上使用INSERT触发器来获取相应的旧行的子节点,并将它们插入子表中。
我在触发器上非常生疏,但是像这样:
CREATE TRIGGER tr_master ON master FOR AFTER INSERT AS
INSERT INTO childtable(masterid, childvalue)
SELECT inserted.id, oldchildren.childvalue
FROM inserted INNER JOIN childtable oldchildren
ON oldchildren.masterid = inserted.copiedfromid
)
因为,当触发发生时,它不“知道”当前插入的记录从哪个主记录中复制出来,你需要在主列的列中跟踪原始记录的主键。 table(我在这里标记为“copiedfromid”)。
“已插入”是触发器中可用的特殊表,其中包含在该事务中插入主表的所有行。我使用“FOR AFTER INSERT”而不是普通的旧“FOR INSERT”,因为我假设你的子表的外键强制主表的引用完整性,所以我想你必须只触发这个动作插入实际发生后。
答案 1 :(得分:1)
编辑已更改为更符合OP的要求。
如果您一次只复制一个主记录。然后使用存储过程复制主服务器和子服务器。在存储的produre上包含错误处理和事务控制。复制代码将是插入语句,如下所示:
declare @NewMasterId int -- or the appropriate type.
insert into MasterCopy (column names ...)
select column names ..
from Master
where MasterId = @MasterId
set @NewMasterId = scope_identity
insert into ChildCopyA (MasterId, column names ...)
select @NewMasterId, column names ...
from ChildA
where MasterId = @MasterId -- FK to master table.
insert into ChildCopyB (MasterId, column names ...)
select @NewMasterId, column names ...
from ChildB
where MasterId = @MasterId -- FK to master table.