c# - 如何将数据行流式传输到sql server?

标签 c# sql-server sql-server-2008 bulkinsert

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

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

我正在尝试找到一个有效的解决方案,但我无法将整个数据集保存在内存中,而且我想尽量减少往返次数。

从源表中读取数据

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/

相关文章:

SQL-Server 全文索引意外结果

sql - 如何安排作业每天运行 SQL 查询?

C#,使用字符串的属性

c# - HtmlAgilityPack 选择的子节点不符合预期

c# - 在 Outlook 插件中获取传入电子邮件的正文

sql - 希望为初始查询中缺失的角色生成新行

sql-server-2008 - sql server 2008 中的电子邮件验证?

c# - SpeakSsmlAsync 返回 BadRequest

sql - SQL Server 子查询无法选择所需的结果

sql-server - 为什么 Microsoft.SqlServer.Smo 没有出现在“添加引用”对话框中