我在 C# 中创建了一个函数,它允许我将记录及其相关子项复制到同一数据库中的新记录和新相关子项。 (这适用于允许使用以前的工作作为新工作模板的应用程序。)
无论如何,它工作得很好......下面是它如何完成复制的描述:
它使用每条记录的当前主键填充一个基于内存的两列查找表。接下来,当它单独创建每个新的副本记录时,它会使用新记录的标识 PK [从 SCOPE_IDENTITY() 检索]更新查找表。现在,当它复制任何相关的 child 时,它可以查找新的父 PK 以在新记录上设置 FK。
在测试中,在 SQL Server 2005 Express Edition 的本地实例上复制关系结构只需要一分钟。不幸的是,事实证明它的生产速度非常慢!我的用户通过 LAN 处理 60,000 多条父记录到我们的 SQL Server!虽然我的复制功能仍然有效,但这些记录中的每一个都代表一个单独的 SQL UPDATE 命令,它以大约 17% 的 CPU 从其正常的 2% 空闲加载 SQL Server。我刚刚测试完一个50,000条记录的副本,花了将近20分钟!
有没有办法在 SQL 查询或存储过程中复制此功能,使 SQL 服务器完成所有复制工作,而不是从每个客户端通过 LAN 发送它?
(我们运行的是 Microsoft SQL Server 2005 标准版。)
谢谢!
-德里克
最佳答案
是的,如果是 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
关于c# - 如何将在其他表中有相关记录的 SQL 记录复制到同一个数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2741252/