我需要从一个数据库复制大型结果集并将其保存到另一个数据库。
存储过程用于获取和存储,因为在保存过程中涉及一些逻辑。
我正在尝试找到一个有效的解决方案,但我无法将整个数据集保存在内存中,而且我想尽量减少往返次数。
从源表中读取数据
var reader = fetchCommand.ExecuteReader();
while (reader.Read()){...}
有没有一种方法可以将此数据插入到另一个 sqlCommand 而无需将整个数据集加载到 DataTable
中,也无需逐行插入行?
Sqlserver 是源数据库和目标数据库上的 MS SQL Server 2008。数据库在不同的服务器上。不能使用 SSIS 或链接服务器。
编辑: 似乎可以使用 table-valued paramaters 将行流式传输到存储过程中.也会研究这种方法。
更新:
是的,可以将数据从 command.ExecuteReader
流出到另一个命令,如下所示:
var reader = selectCommand.ExecuteReader();
insertCommand.Parameters.Add(
new SqlParameter("@data", reader)
{SqlDbType = SqlDbType.Structured}
);
insertCommand.ExecuteNonQuery();
其中 insertCommand
是一个带有表值参数 @data
的存储过程。
最佳答案
您需要SqlBulkCopy
。你可以像这样使用它:
using (var reader = fetchCommand.ExecuteReader())
using (var bulkCopy = new SqlBulkCopy(myOtherDatabaseConnection))
{
bulkCopy.DestinationTableName = "...";
bulkCopy.ColumnMappings = ...
bulkCopy.WriteToServer(reader);
}
还有一个属性可以设置批量大小。大约 1000 行可能会给您内存使用和速度之间的最佳权衡。
虽然这不会让您将其通过管道传输到存储过程中,但最好的方法可能是将数据复制到临时表,然后在服务器上运行批量更新命令以将数据复制到其最终位置。这通常比为每一行执行大量单独的语句要快得多。
关于c# - 如何将数据行流式传输到sql server?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7011151/