【问题标题】:How can I copy a SQL record which has related records in other tables to the same database?如何将在其他表中有相关​​记录的 SQL 记录复制到同一个数据库?
【发布时间】:2010-04-29 22:44:28
【问题描述】:

我在 C# 中创建了一个函数,它允许我将记录及其相关子项复制到同一数据库中的新记录和新相关子项中。 (这适用于允许将以前的作品用作新作品的模板的应用程序。)

不管怎样,它很好用……下面是它如何完成复制的描述:

它使用每条记录的当前主键填充基于内存的两列查找表。接下来,当它单独创建每个新副本记录时,它使用新记录的身份 PK [从 SCOPE_IDENTITY() 检索] 更新查找表。现在,当它复制任何相关子代时,它可以查找新的父 PK 以在新记录上设置 FK。

在测试中,只需一分钟即可在 SQL Server 2005 Express Edition 的本地实例上复制关系结构。不幸的是,事实证明它的生产速度非常慢!我的用户正在通过 LAN 与我们的 SQL Server 处理每条父记录的 60,000 多条记录!虽然我的复制功能仍然有效,但这些记录中的每一个都代表一个单独的 SQL UPDATE 命令,它以大约 17% 的 CPU 加载 SQL Server,而其正常的 2% 空闲。我刚刚完成了 50,000 条记录副本的测试,花了将近 20 分钟!

有没有办法在 SQL 查询或存储过程中复制此功能,以使 SQL 服务器完成所有复制工作,而不是从每个客户端通过 LAN 爆破它?

(我们运行的是 Microsoft SQL Server 2005 标准版。)

谢谢!

-德里克

【问题讨论】:

    标签: c# sql copy relational records


    【解决方案1】:

    是的,如果是 SQL 2005,您可以使用 CLR 存储过程将您的 C# 代码安装到 Db 中。要做纯 TSQL,只是它很乏味并且需要为新键使用变量。这只是一个父记录的情况,然后是许多仅在一个子表中的子记录吗?在这种情况下,您可以通过利用可以将 select 语句嵌入到插入中这一事实来潜在地避免为每个子行发出单独的插入命令,尤其是当您为 PK 使用标识列时。如果你能做到,那通常会快得多。 像这样的东西(语法可能有点不对,但无论如何你都需要适应你的真实表格):

    insert into tblchild select @newparentId, col1,col2 from tblChild where parentid=@oldparentid
    

    这是 SQL Server 中 CLR 的起点...

    http://msdn.microsoft.com/en-us/library/ms131045.aspx(本文是 SQL 2008,但其中大部分内容可能适用)。

    http://www.sqlteam.com/article/writing-clr-stored-procedures-in-charp-introduction-to-charp-part-1

    【讨论】:

    • 谢谢,吉姆!我一直在使用 ADO.NET 函数,并试图尽可能长时间地将自己与存储过程隔离开来。 CLR 存储过程看起来像是要走的路。不幸的是,父表有多个子表,其中两个与另一个在复合 PK 中使用它们的 PK 的表具有一对一的关系,所以我肯定需要一种更自动化的方法来做到这一点。再次感谢! -德里克
    【解决方案2】:

    将使用(伪代码)

    INSERT INTO (PkField, FkField, OtherFields) SELECT NewPkValue, NewFkValue, OtherFields FROM TableName WHERE FkField = OldFkValue
    

    对相关子表的帮助,因为它们将被批处理而不是每条记录的单个更新?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-23
      相关资源
      最近更新 更多