参数化多行插入SQL Server

时间:2017-06-13 15:43:17

标签: c# sql-server

我面临的情况是我需要一次将多达17,000行插入SQL Server数据库。我已经提出了两种方法来做到这一点,但我在C#中查询参数化时会被绊倒。

一个警告:我担心表现,但不要排除其他所有 - 如果我正在进行的操作需要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路线。我在这里遇到的唯一问题是我无法找到任何指示如何参数化的内容,或者我是否需要。我是否需要担心逃避我的数据或处理参数?

1 个答案:

答案 0 :(得分:0)

这里没有太多内存批量复制的经验,但我当然可以回答这个问题:

  

我不知道如何对可以拥有的INSERT进行参数化   其中包含未知数量的变量。

您可以通过在用于将其添加到查询的同一循环中添加参数来实现。

要扩展您的伪代码,您可以替换它:

   BuildAndExecuteQuery(records);

有这样的事情:

foreach record in records
{
   Add parameter(s) to the query
   Add the same parameter(s) to the command's Parameters collection
}
ExecuteQuery