Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.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# 如何将数据行流式传输到sqlserver?_C#_Sql Server_Sql Server 2008_Bulkinsert - Fatal编程技术网

C# 如何将数据行流式传输到sqlserver?

C# 如何将数据行流式传输到sqlserver?,c#,sql-server,sql-server-2008,bulkinsert,C#,Sql Server,Sql Server 2008,Bulkinsert,我需要从一个数据库复制大型resultset并将其保存到另一个数据库 存储过程用于获取和存储,因为在保存过程中涉及一些逻辑 我正试图找到一个有效的解决方案,我无法将整个数据集保存在内存中,我希望尽量减少往返次数 从源表中读取数据时使用 var reader = fetchCommand.ExecuteReader(); while (reader.Read()){...} 有没有一种方法可以将此数据插入到另一个sqlCommand,而无需将整个数据集加载到数据表中,也无需逐个插入行 Sqlse

我需要从一个数据库复制大型resultset并将其保存到另一个数据库

存储过程用于获取和存储,因为在保存过程中涉及一些逻辑

我正试图找到一个有效的解决方案,我无法将整个数据集保存在内存中,我希望尽量减少往返次数

从源表中读取数据时使用

var reader = fetchCommand.ExecuteReader();
while (reader.Read()){...}
有没有一种方法可以将此数据插入到另一个sqlCommand,而无需将整个数据集加载到
数据表中
,也无需逐个插入行

Sqlserver在源数据库和目标数据库上都是MS SQL Server 2008。数据库位于不同的服务器上。使用SSI或链接服务器不是一个选项

编辑: 似乎可以使用将行流式传输到存储过程中。我们也将研究这种方法

更新: 是的,可以将数据从
命令.ExecuteReader
流式输出到另一个命令,如下所示:

var reader = selectCommand.ExecuteReader();
insertCommand.Parameters.Add(
    new SqlParameter("@data", reader)
        {SqlDbType = SqlDbType.Structured}
    );

insertCommand.ExecuteNonQuery();
using (var reader = fetchCommand.ExecuteReader())
using (var bulkCopy = new SqlBulkCopy(myOtherDatabaseConnection))
{
  bulkCopy.DestinationTableName = "...";
  bulkCopy.ColumnMappings = ...
  bulkCopy.WriteToServer(reader);
}

其中,
insertCommand
是一个具有表值参数
@data
的存储过程,您需要
SqlBulkCopy
。您可以这样使用它:

var reader = selectCommand.ExecuteReader();
insertCommand.Parameters.Add(
    new SqlParameter("@data", reader)
        {SqlDbType = SqlDbType.Structured}
    );

insertCommand.ExecuteNonQuery();
using (var reader = fetchCommand.ExecuteReader())
using (var bulkCopy = new SqlBulkCopy(myOtherDatabaseConnection))
{
  bulkCopy.DestinationTableName = "...";
  bulkCopy.ColumnMappings = ...
  bulkCopy.WriteToServer(reader);
}
还有一个属性用于设置批大小。大约1000行可能会让您在内存使用和速度之间取得最佳平衡

虽然这不允许将数据通过管道传输到存储过程中,但最好的方法可能是将数据复制到临时表中,然后在服务器上运行bulkupdate命令将数据复制到其最终位置。这通常比为每一行执行许多单独的语句快得多。

您可以与数据读取器一起使用,数据读取器大致执行您要求的操作(非缓冲等)-但是,这不会调用存储过程来插入。如果需要,可以使用
SqlBulkCopy
将数据推送到第二个表中(相同的结构),然后在DB服务器上,在本地调用存储过程的行上循环。这样,延迟等就不再是问题(因为循环都在DB服务器上)