我想创建一个可以轻松复制表的多个记录的过程(或.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(员工反之亦然)
提前致谢!
答案 0 :(得分:1)
insert into Customer
select row_number() over(order by ID)+(select MAX(Id) from Customer) as id ,
Name,[Address] from Customer
这可能对你有帮助......