Sql 当行有子行时复制数据库中的行

Sql 当行有子行时复制数据库中的行,sql,sql-server-2008,Sql,Sql Server 2008,我需要复制表中的一行,还需要复制其他表中通过其外键链接到该行的所有行。然后复制链接到这些行的所有行 问题是,当我复制行时,键会改变。如何通过表之间的关系传播这些更改?有点“黑客”,但我经常添加一列“复制\u of \u id”,以便存储旧的id,然后为新创建的值复制从属表中的所有行 它并不漂亮,但有一些优点,比如说,可以追踪正在发生的事情 当然,您也可以为此使用帮助器表。包含旧ID列和新ID列。这不会污染主表。您可以编写一个实现所有复制逻辑的存储过程 基本上: 在主表中插入复制行- 在变量中存储

我需要复制表中的一行,还需要复制其他表中通过其外键链接到该行的所有行。然后复制链接到这些行的所有行


问题是,当我复制行时,键会改变。如何通过表之间的关系传播这些更改?

有点“黑客”,但我经常添加一列“复制\u of \u id”,以便存储旧的id,然后为新创建的值复制从属表中的所有行

它并不漂亮,但有一些优点,比如说,可以追踪正在发生的事情


当然,您也可以为此使用帮助器表。包含旧ID列和新ID列。这不会污染主表。

您可以编写一个实现所有复制逻辑的存储过程

基本上:

在主表中插入复制行- 在变量中存储新ID 插入 子表中每行的副本, 在变量中引用FK。将子行的ID存储在variable2中 在依赖于子表的表中插入新行,引用变量2中的FK。
简而言之,编写一个从顶部开始的存储过程,并根据需要向下遍历任意多个表。

创建新的父行时,@@IDENTITY和SCOPE\u IDENTITY将包含新标题的Id

然后可以使用它们创建子行,例如

INSERT INTO parent_table (parent_field1, parentfield2) VALUES('Some stuff', 'Other stuff');

INSERT INTO child_table (parent_id, other_field) VALUES(SCOPE_IDENTITY(), 'Etc.')

查看MSDN中的代码示例。

如果您有一个ORM系统,那么您可以从数据库中检索对象并将其作为新对象写回,而不是通常的更新。我想到了这一点,但是,child_表的子项会导致问题。我不确定如何处理子表的子项。我们需要更多的细节来理解为什么它们会成为问题。子表的子表与主表的子表没有什么不同-它只是另一个层次的深度。如果我插入到子表中,请从foreignkey=1的子表中选择值-这可能会插入多个子行。如果我使用SCOPE_IDENTITY,我只能对添加的最后一行进行进一步查询。然后你需要使用游标来获取所有子行,并一次处理一行。因此,我希望复制的每个表都有一个游标?这很有帮助-我创建了一个带有tablename、oldid和newid的临时帮助表。