Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.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
C# 如何将在其他表中具有相关记录的SQL记录复制到同一数据库?_C#_Sql_Copy_Relational_Records - Fatal编程技术网

C# 如何将在其他表中具有相关记录的SQL记录复制到同一数据库?

C# 如何将在其他表中具有相关记录的SQL记录复制到同一数据库?,c#,sql,copy,relational,records,C#,Sql,Copy,Relational,Records,我在C中创建了一个函数,它允许我将记录及其相关子项复制到同一数据库中的新记录和新相关子项。这适用于允许将以前的工作用作新工作模板的应用程序 不管怎样,它工作得很好。。。以下是它如何完成复制的描述: 它使用每个记录的当前主键填充基于内存的两列查找表。接下来,当它单独创建每个新的复制记录时,它用新记录的标识PK[从SCOPE_Identity检索]更新查找表。现在,当它复制任何相关的子级时,它可以查找新的父PK以在新记录上设置FK 在测试中,在SQLServer2005ExpressEdition的

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

不管怎样,它工作得很好。。。以下是它如何完成复制的描述:

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

在测试中,在SQLServer2005ExpressEdition的本地实例上复制关系结构只需一分钟。不幸的是,它被证明是可怕的缓慢生产!我的用户在SQL Server的LAN上处理每个父记录60000多条记录!虽然我的复制函数仍然有效,但这些记录中的每一条都代表一个单独的SQL UPDATE命令,并且它以大约17%的CPU从其正常的2%空闲负载加载SQL Server。我刚刚测试完一张50000张的唱片,差不多花了20分钟

有没有办法在SQL查询或存储过程中复制此功能,以使SQL server执行所有复制工作,而不是从每个客户端通过LAN对其进行爆破

我们正在运行Microsoft SQL Server 2005标准版

谢谢


-Derek

是的,如果是SQL 2005,则可以使用CLR存储过程将C代码安装到数据库中。要实现纯TSQL,这只是一个乏味的问题,需要为新键使用变量。这仅仅是一个父记录,然后是很多只在一个子表中的子记录的情况吗?在这种情况下,通过利用可以将select语句嵌入insert的事实,可以避免为每个子行发出单独的insert命令,尤其是在PKs使用标识列的情况下。如果你能做到的话,这通常会快得多。 类似这样的语法可能有点不合适,但无论如何,您都需要将其适应于实际的表:

insert into tblchild select @newparentId, col1,col2 from tblChild where parentid=@oldparentid
以下是SQL Server中CLR的起点

本文是SQL2008,但大部分内容可能都适用


你会使用伪代码吗

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

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

谢谢,Jim!我一直在使用ADO.NET函数,并试图尽可能长时间地避免处理存储过程。CLR存储过程看起来是一个不错的选择。不幸的是,父表有多个子表,其中两个子表与在复合PK中使用其PK的另一个表有1对1的关系,因此我肯定需要一种更自动化的方法来实现这一点。再次感谢-德里克