使用 SqlBulkCopy 查询
Using a query for SqlBulkCopy
我有一个参数化查询,为了演示目的,我们假设它是
SELECT Id, Name
FROM People
WHERE Age >= @Age
假设这可能是数百万条记录,我想将这些记录批量加载到 table Population (Id, Name)
.
按照我看到的关于 SqlBulkCopy
的大多数示例,我会使用第一个查询来获取数据table,然后我可以将该数据table 批量加载到 Population
但是我不需要读取查询,将其放入内存只是为了再次编写它。本质上,我想将我的查询批量加载到 table 中,而不必在 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
知道我想要批量加载的查询将作为一个变量(带有参数)出现,因为我不知道查询是什么,只是我希望它能很好地映射并且我希望它批量加载.
每条评论:
没有 MARS,除了使用 DataTable 并将其用于 SqlBulkCopy 之外别无他法,因为当数据 reader 仍处于打开状态时,您无法使用相同的连接进行批量复制。您必须关闭第一个连接才能稍后与 SqlBulkCopy 一起使用。
我有一个参数化查询,为了演示目的,我们假设它是
SELECT Id, Name
FROM People
WHERE Age >= @Age
假设这可能是数百万条记录,我想将这些记录批量加载到 table Population (Id, Name)
.
按照我看到的关于 SqlBulkCopy
的大多数示例,我会使用第一个查询来获取数据table,然后我可以将该数据table 批量加载到 Population
但是我不需要读取查询,将其放入内存只是为了再次编写它。本质上,我想将我的查询批量加载到 table 中,而不必在 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
知道我想要批量加载的查询将作为一个变量(带有参数)出现,因为我不知道查询是什么,只是我希望它能很好地映射并且我希望它批量加载.
每条评论:
没有 MARS,除了使用 DataTable 并将其用于 SqlBulkCopy 之外别无他法,因为当数据 reader 仍处于打开状态时,您无法使用相同的连接进行批量复制。您必须关闭第一个连接才能稍后与 SqlBulkCopy 一起使用。