SQL-复制具有相关子记录的记录

时间:2009-07-23 06:30:49

标签: sql tsql

我想在SQL中复制一行,其中包含2个其他表中的子记录。如果主记录重复,我想复制它们。

例如,如果我说我想将id为15的主记录复制到新记录中。我希望所有的子记录都与新的主记录ID重复。可以通过TSQL使用循环和条件来完成。但我只是想知道是否有更好的选择。

感谢。

2 个答案:

答案 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.