SQL插入一行或多行数据?

Dav*_*.ca 9 c# sql t-sql sql-server sql-server-2005

我正在使用控制台应用程序将数据插入到MS SQL Server 2005数据库.我有一个要插入的对象列表.这里我使用Employee类作为示例:

List<Employee> employees;
Run Code Online (Sandbox Code Playgroud)

我能做的是在这个时间插入一个对象:

foreach (Employee item in employees)
{
  string sql = @"INSERT INTO Mytable (id, name, salary) 
    values ('@id', '@name', '@salary')";
  // replace @par with values
  cmd.CommandText = sql; // cmd is IDbCommand
  cmd.ExecuteNonQuery();
}
Run Code Online (Sandbox Code Playgroud)

或者我可以像这样构建一个balk插入查询:

string sql = @"INSERT INTO MyTable (id, name, salary) ";
int count = employees.Count;
int index = 0;
foreach (Employee item in employees)
{
   sql  = sql + string.format(
     "SELECT {0}, '{1}', {2} ",
     item.ID, item.Name, item.Salary);
   if ( index != (count-1) )
      sql = sql + " UNION ALL ";
   index++
 }
 cmd.CommandType = sql;
 cmd.ExecuteNonQuery();
Run Code Online (Sandbox Code Playgroud)

我想后一种情况是一次插入数据行.但是,如果我有几个k的数据,SQL查询字符串是否有任何限制?

在性能方面,我不确定一行插入多行是否优于一行插入一行数据?

有什么建议以更好的方式做到这一点?

kem*_*002 14

实际上,你写它的方式,你的第一个选择将更快.

  1. 你的第二个例子有一个问题.你正在做sql = + sql +等.这将导致为循环的每次迭代创建一个新的字符串对象.(查看StringBuilder类).从技术上讲,您将在第一个实例中创建一个新的字符串对象,但区别在于它不必复制上一个字符串选项中的所有信息.

  2. 你设置它的方式,当你最终发送它时,SQL Server将不得不潜在地评估一个大规模的查询,这肯定需要一些时间来弄清楚它应该做什么.我应该说,这取决于你需要做多大的插入.如果n很小,你可能会好起来,但随着它的增长你的问题只会变得更糟.

由于SQL Server处理批处理事务的方式,批量插入比单个插入更快.如果要从C#插入数据,则应采用第一种方法并将每500次插入包装说明并提交,然后执行下一次500,依此类推.这样做的另一个好处是,如果批处理失败,您可以捕获这些并找出出错的地方并重新插入.还有其他方法可以做到,但这绝对是对所提供的两个示例的改进.

var iCounter = 0;
foreach (Employee item in employees)
{

   if (iCounter == 0)
  {
    cmd.BeginTransaction;
  }
  string sql = @"INSERT INTO Mytable (id, name, salary) 
    values ('@id', '@name', '@salary')";
  // replace @par with values
  cmd.CommandText = sql; // cmd is IDbCommand
  cmd.ExecuteNonQuery();
  iCounter ++;
  if(iCounter >= 500)
  {
     cmd.CommitTransaction;
     iCounter = 0;
  }
}

if(iCounter > 0)
   cmd.CommitTransaction;
Run Code Online (Sandbox Code Playgroud)