Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2005 t sql复制级联表中的行_Sql Server 2005_Tsql - Fatal编程技术网

Sql server 2005 t sql复制级联表中的行

Sql server 2005 t sql复制级联表中的行,sql-server-2005,tsql,Sql Server 2005,Tsql,在这种情况下,我有几个相关/级联表。假设所有的1对多关系都沿着表1、表2、表3、表4等层叠而下。我拥有的是表中的默认行。它们从表1中的一条记录开始,在其他表中有一条或多条相关记录 我要寻找的是一种简单的方法来复制行,并为每个行创建/维护新的主键。通过维护,我的意思是,table1.ID1是复制的,因此现在有了table1.ID2,所有其他列都是相同的,只有ID发生了更改 最重要的是,它在所有其他表中的所有相关行都被复制,并且外键/主键都指向新的 因此,table2的外键为table1.ID2,主

在这种情况下,我有几个相关/级联表。假设所有的1对多关系都沿着表1、表2、表3、表4等层叠而下。我拥有的是表中的默认行。它们从表1中的一条记录开始,在其他表中有一条或多条相关记录

我要寻找的是一种简单的方法来复制行,并为每个行创建/维护新的主键。通过维护,我的意思是,table1.ID1是复制的,因此现在有了table1.ID2,所有其他列都是相同的,只有ID发生了更改

最重要的是,它在所有其他表中的所有相关行都被复制,并且外键/主键都指向新的

因此,table2的外键为table1.ID2,主键为table2.ID#,table2行中的其余列与表2中复制的行相同

我很懒,试图摆脱管理ID和创建一个很长的存储过程


我认为这是不可能的,但我希望我错了。提前感谢。

最近我们的一个项目中有一些功能需要这样做

我们最终使用递归存储过程来完成它。每次通话需要两条信息:

  • 复制记录的表的名称
  • 要复制的表的父表的主键
因此,如果有两个表A和B,其中A.aid是A的主键,B.aid引用它,则需要在伪代码中执行以下操作:

Function deep_copy (table, parent)
  For each record in table whose parent is parent
    Create a new PK and copy this record
    For each subtable of table
      Call self with parameters (subtable, newPK)
您可以调用
deep\u copy
对要复制的每个记录进行复制。然后,
deep_copy
将调用B中需要复制的记录,以及B的任何其他同级表。问题是您需要元信息来知道B是a的子表。我们碰巧已经存储了该元信息,因此不必做任何特殊的操作来获取它


它最终不是一个很大的存储过程。如果您的PK都是identity列,那么这会使整个过程变得简单很多。不过,它的分支非常多。这不完全是一个有效的算法。但是,这又是一个内在的复杂问题,关系数据模型的设计并不能很好地处理这个问题。

触发器正是为此而创建的。然而,好的触发器很难编写,也很难维护。但是,如果您正确地理解了它们,那么很容易实现您描述的场景