如何将数据流流入sqlserver?

zza*_*ndy 4 c# sql-server bulkinsert sql-server-2008

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

存储过程用于获取和存储,因为在保存期间涉及某些逻辑.

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

从源表读取数据

var reader = fetchCommand.ExecuteReader();
while (reader.Read()){...}
Run Code Online (Sandbox Code Playgroud)

有没有办法将这些数据插入另一个sqlCommand,而无需将整个数据集加载到一个DataTable但没有插入一行的数据?

Sqlserver是源数据库和目标数据库上的MS SQL Server 2008.数据库位于不同的服务器上.不能使用SSIS或链接服务器.

编辑: 似乎可以使用表值参数将行流式传输到存储过程中.也将研究这种方法.

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

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

insertCommand.ExecuteNonQuery();
Run Code Online (Sandbox Code Playgroud)

insertCommand带有表值参数的存储过程在哪里@data.

Tim*_*ers 5

你需要SqlBulkCopy.您可以像这样使用它:

using (var reader = fetchCommand.ExecuteReader())
using (var bulkCopy = new SqlBulkCopy(myOtherDatabaseConnection))
{
  bulkCopy.DestinationTableName = "...";
  bulkCopy.ColumnMappings = ...
  bulkCopy.WriteToServer(reader);
}
Run Code Online (Sandbox Code Playgroud)

还有一个属性可以设置批量大小.像1000行这样的东西可能会让你在内存使用和速度之间做出最佳平衡.

虽然这不允许您将其传递到存储过程,但最好的方法可能是将数据复制到临时表,然后在服务器上运行批量更新命令以将数据复制到其最终位置.这通常比为每行执行大量单独的语句更快.