我正面临一种情况,我需要一次将多达17,000行插入到SQL Server数据库中。我已经想出了两种方法来做到这一点,但是我被C#中的查询参数化绊住了。参数化的多行插入SQL Server
一个警告:我担心表现,但不排除其他 - 如果我正在做的操作需要8分钟,那么是否为数据插入添加另外5秒对10秒并不重要。如果数据插入在初始操作之上需要额外的10分钟,那么这是一件大事。
选项1:多行插入(分块)
第一个选择是做一个简单的多行插入:
INSERT INTO MyTable (FirstName, LastName, Age)
VALUES
('Bob', 'Smith', 24),
('Sally', 'Jones', 32),
('Jennifer', 'Johnson', 23)
我会通过一些建立几个这样的查询喜欢这个。然而
var queriesNeeded = people.Count/250;
for (int i = 0; i < queriesNeeded; i++)
{
var records = people.Skip(i * 250).Take(250);
BuildAndExecuteQuery(records);
}
// Handle anything left over
var leftoverRecords = people.Skip(queriesNeeded * 250);
BuildAndExecuteQuery(leftoverRecords);
,虽然我知道如何: - (它的意思是说明我的观点我在写这离我的头顶,所以几乎可以肯定有一个错误在这里这并不重要。)参数化一个基本的单行INSERT,我不知道如何去参数化一个INSERT
,它可能有一个未知数量的变量。有没有办法做到这一点?我将如何去创建我的SqlCommand
?
选项2:SqlBulkCopy类
或者......我可以去SqlBulkCopy路线。我在这里唯一的问题是,我找不到任何指示如何参数化的东西,或者我甚至需要。我是否需要担心转义数据或处理参数?
是记录了数据库中的表或其他一些输入? –
使用表值参数,这是非常简单的。 https://docs.microsoft.com/en-us/sql/relational-databases/tables/use-table-valued-parameters-database-engine –
或SqlBulkCopy与DataTable,这意味着您不必担心转义任何东西。 –