【问题标题】:Copy part of a tables content and all records of other talbes referencing the copied records复制表格内容的一部分以及引用复制记录的其他表格的所有记录
【发布时间】:2014-01-24 06:39:40
【问题描述】:

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

表 1 客户:“ID”、“姓名”、“地址”、...

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

表 3 项目:“ID”、“CustomerID”、“Name”、“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(员工反之亦然)

提前致谢!

【问题讨论】:

  • 如果你想分配一个特定的 id(只有 20 个应该分配给 id 为 2 的记录)你需要这样做,否则如果你希望 id 是最大 id 的增量在您的表格中,您可以通过单个查询来完成...
  • 感谢您的评论,但我真的不希望分配特定的 ID。我只希望复制的记录引用其他复制的记录及其新 ID(这意味着在插入复制的记录时会生成 ID)。我添加了一个示例以更好地理解我想要实现的目标,也许现在会更清楚,但无论如何感谢您的尝试!

标签: sql .net sql-server database


【解决方案1】:
insert into Customer
select row_number() over(order by ID)+(select MAX(Id) from Customer) as id , 
Name,[Address] from Customer

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

【讨论】:

    猜你喜欢
    • 2017-09-20
    • 2012-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-26
    相关资源
    最近更新 更多