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.
你需要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行这样的东西可能会让你在内存使用和速度之间做出最佳平衡.
虽然这不允许您将其传递到存储过程,但最好的方法可能是将数据复制到临时表,然后在服务器上运行批量更新命令以将数据复制到其最终位置.这通常比为每行执行大量单独的语句更快.
| 归档时间: |
|
| 查看次数: |
1954 次 |
| 最近记录: |