gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 00:34:41 25 4
gpt4 key购买 nike

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

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

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

从源表中读取数据

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com