C# 如何将数据行流式传输到sqlserver?
我需要从一个数据库复制大型resultset并将其保存到另一个数据库 存储过程用于获取和存储,因为在保存过程中涉及一些逻辑 我正试图找到一个有效的解决方案,我无法将整个数据集保存在内存中,我希望尽量减少往返次数 从源表中读取数据时使用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
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服务器上)