复制表内容的一部分以及引用复制记录的其他表的所有记录

时间:2014-01-24 06:39:41

标签: sql .net sql-server database

我想创建一个可以轻松复制表的多个记录的过程(或.Net代码)。每个表都使用代理键作为主键。因此,我可能无法使用“INSERT INTO SELECT”之类的东西简单地复制所需的记录,因为它们可能会引用错误的记录

  

表1客户:“ID”,“名称”,“地址”,......

     

表2员工:“ID”,“CustomerID”,“FirstName”,“LastName”,...

     

表3项目:“ID”,“CustomerID”,“名称”,“ResponsibleEmployee”,“StartDate”,...

基本上我希望能够将完整的客户(例如ID为1的客户)复制到已创建ID为2的新客户。这意味着我需要复制其他表的每个记录(在本例中为“CustomerEmployee”和“Project”表),将字段“CustomerID”设置为新的ID 2并更改引用(在此示例中为“ ResponsibleCustomerEmployee“)也是一个已被复制的新记录。

我的问题是,我不知道最好的方法是创建可以做到这一点的东西。我想出的最好的想法是做两步复制过程。首先复制所有表内容,而不触及引用其他记录的列的值。当插入这些记录时,我会写一些类似于旧ID值和新ID值之间映射的映射表。在第二步中,我将尝试使用映射表更正引用(意味着“复制的项目ID为1引用了ID为2的CustomerEmployee,根据映射表,复制的CustomerEmployee的ID为20,因此复制的项目必须引用这个新的ID 20而不是2“)。

我的问题是,是否有更简单的方法来实现这一目标?或者我的想法是否正常工作还是我错过了什么?我不认为我是第一个遇到这种问题的人,但我无法在互联网上找到合适的解决方案。也许有人知道一个解决方案甚至第三方.NET组件可能会做我想要的(数据库在.NET应用程序中使用意味着它不一定是直接在SQL Server中。

更新:添加了示例!

在执行复制过程之前,表应如下所示(注意:ID是标识列,以ID结尾的所有内容都引用相应的表):

ID | Name         | Address
------------------------------------------
1  | "Customer 1" | "Street of Testcity 1"
2  | "Customer 2" | "Another Address"


ID | CustomerID | FirstName | LastName
--------------------------------------
1  | 1          | "John"    | "Doe"
2  | 1          | "Max"     | "Test"
3  | 2          | "Jane"    | "Doe"


ID | CustomerID | Name            | ResponsibleEmployeeID | StartDate
----------------------------------------------------------------------
1  | 1          | "Testproject 1" | 2                     | 2014-01-01
2  | 1          | "Testproject 2" | 1                     | 2014-01-01

现在我想执行一个复制过程(存储过程,.net代码或其他任何操作)并使用ID 1和所有相关对象(即使用定义的外键引用该客户的所有记录)复制客户。在完成该过程后,表格应如下所示(复制的条目标有*):

ID | Name         | Address
------------------------------------------
1  | "Customer 1" | "Street of Testcity 1"
2  | "Customer 2" | "Another Address"
3  | "Customer 1" | "Street of Testcity 1"   *


ID | CustomerID | FirstName | LastName
--------------------------------------
1  | 1          | "John"    | "Doe"
2  | 1          | "Max"     | "Test"
3  | 2          | "Jane"    | "Doe"
4  | 3          | "John"    | "Doe"    *
5  | 3          | "Max"     | "Test"   *


ID | CustomerID | Name            | ResponsibleEmployeeID | StartDate
----------------------------------------------------------------------
1  | 1          | "Testproject 1" | 2                     | 2014-01-01
2  | 1          | "Testproject 2" | 1                     | 2014-01-01 
3  | 3          | "Testproject 1" | 5                     | 2014-01-01  *
4  | 3          | "Testproject 2" | 4                     | 2014-01-01  *

我遇到的问题是,我需要一种方法来修复引用的记录,因为引用CustomerID 1的内容现在应该引用CustomerID 3(员工反之亦然)

提前致谢!

1 个答案:

答案 0 :(得分:1)

insert into Customer
select row_number() over(order by ID)+(select MAX(Id) from Customer) as id , 
Name,[Address] from Customer

这可能对你有帮助......