Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.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 复制表格内容的一部分以及引用复制记录的其他表格的所有记录_Sql_.net_Sql Server_Database - Fatal编程技术网

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

Sql 复制表格内容的一部分以及引用复制记录的其他表格的所有记录,sql,.net,sql-server,database,Sql,.net,Sql Server,Database,我想创建一个过程(或.Net代码),它可以轻松地复制一个表的多条记录。每个表都使用代理键作为主键。因此,我可能无法简单地使用“insertintoselect”之类的东西复制所需的记录,因为它们可能引用了错误的记录 表1客户:“身份证”、“姓名”、“地址” 表2员工:“ID”、“CustomerID”、“FirstName”、“LastName”、 表3项目:“ID”、“客户ID”、“姓名”、“责任员工”、“起始日期” 基本上,我希望能够复制一个完整的客户(例如,ID为1的客户到已创建的ID为2

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

表1客户:“身份证”、“姓名”、“地址”

表2员工:“ID”、“CustomerID”、“FirstName”、“LastName”、

表3项目:“ID”、“客户ID”、“姓名”、“责任员工”、“起始日期”

基本上,我希望能够复制一个完整的客户(例如,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结尾的所有内容都引用相应的表):

现在,我想执行一个复制过程(存储过程、.net代码或任何能起作用的东西),并复制ID为1的客户和所有相关对象(即使用定义的外键引用该客户的所有记录)。该过程完成后,表应该是这样的(复制的条目用*标记):

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

提前谢谢

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

这可能会帮助您……

如果您想要分配一个特定的id(只有20个应该分配给id为2的记录)您需要这样做,如果您希望id是表中最大id的增量,您可以通过单个查询来完成…感谢您的评论,但我并不真正希望分配特定id。我只希望复制的记录引用其他复制的记录及其新id(这意味着ID是在插入复制的记录时生成的)。为了更好地理解我想要实现的目标,我添加了一个示例,也许现在会更清楚,但无论如何,感谢您的尝试!
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  *
insert into Customer
select row_number() over(order by ID)+(select MAX(Id) from Customer) as id , 
Name,[Address] from Customer