使用查询查询SqlBulkCopy

时间:2018-09-08 02:07:00

标签: c# sqlbulkcopy

我有一个参数化查询,出于演示目的,让我们假设它是

SELECT Id, Name 
FROM People 
WHERE Age >= @Age

让我们假设这可能是数百万条记录,我想将这些记录批量加载到表Population (Id, Name)中。

通过遵循我看到的关于SqlBulkCopy的大多数示例,我将使用第一个查询来获取数据表,然后可以将该数据表批量加载到Population中,但是我不需要阅读查询,将其存入内存只是为了再次写入。本质上,我想将查询批量加载到表中,而不必用C#读取查询,所有IO都应在数据库中进行。

我该如何处理?这是我的尝试:

using (var conn = new SqlConnection(SomeConnectionString))
using (var cmd = conn.CreateCommand())
{
    conn.Open();
    cmd.CommandText = "SELECT Id, Name FROM People WHERE Age >= @Age";
    cmd.Parameters.AddWithValue("@Age", 10);

    using (var reader = cmd.ExecuteReader())
    using (SqlBulkCopy bulkcopy = new SqlBulkCopy(SomeConnectionString))
    {
        bulkcopy.DestinationTableName = "[Population]";
        bulkcopy.WriteToServer(reader);
        bulkcopy.Close();
    }
}

我不确定ExecuteReader是只是设置一个指针来开始读取还是实际将查询读入内存。

在有人建议执行查询之前

INSERT INTO Population
    SELECT Id, Name 
    FROM People 
    WHERE Age >= @Age

知道我要批量加载的查询将作为变量(带有参数)出现,因为我不知道查询将是什么,只是我希望它能够很好地映射并且希望批量加载。 / p>

1 个答案:

答案 0 :(得分:0)

每个评论:

没有MARS,除了使用DataTable并将其用于SqlBulkCopy,别无其他方法,因为在数据读取器仍处于打开状态时,无法将相同的连接用于批量复制。您必须先关闭第一个连接才能在以后与SqlBulkCopy一起使用。