回答

收藏

SQL插入一行还是多行数据?

技术问答 技术问答 160 人阅读 | 0 人回复 | 2023-09-14

我在控制台应用程序中插入数据MS SQL Server 2005数据库。我有一个需要插入的对象列表。我在这里Employee类为例:0 X7 Q: H( U7 K- O$ Z1 M
List employees;我所能做的就是在一段时间内插入一个对象:+ a! l/ I3 }8 l
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();}或者,我可以像这样建立一个不插入的查询:
6 h$ d1 q$ a0 {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}",    item.ID,item.Name,item.Salary);   if ( index != (count-1) )         sql = sql   " UNION ALL ";   index   } cmd.CommandType = sql; cmd.ExecuteNonQuery();我猜后一种情况会立即插入数据行。但是,如果我有成千上万的数据,SQL查询字符串是否有限制?! p' z3 |) s1 M( Y/ \: o
就性能而言,我不确定一次插入多行是否胜过一次插入一行数据。
" K( v" f( T# s; ^- P有没有更好的建议?4 Z9 C# g) Z# M, X  O' x3 ?
                                                                . Y1 j  p, y6 r% y9 Q$ V
    解决方案:                                                               
, a8 d$ K2 z' P6 w% T( q- t, z                                                                事实上,按照你的写作方式,你的第一选择会更快。/ D: P8 n5 C: K; p! w( ^
[ol]你的第二个例子中有一个问题。你正在执行它sql =   sql  等等。这将导致为每迭代创建一个新的字符串对象。StringBuilder类)。从技术上讲,你也会在第一个例子中创建一个新的字符串对象,但区别在于它不需要复制之前字符串选项中的所有信息。
7 v# r' G$ w4 A1 n8 j根据您的设置方式,SQL Server在最终发送查询时,可能需要查询时进行评估,这肯定需要一些时间来找出它应该做什么。我应该指出,这取决于你需要执行多少插入。n你可能没事,但随着它的增长,你的问题只会变得更糟。
6 y0 c8 ]( g/ Y! O[/ol]由于SQL
; z. W. y; L( o- oServer如何处理批量事务,所以批量插入比单个插入快。如果要从C#插入数据时,应使用第一种方法将每500个插入包装并提交一次事务,然后执行以下500个,以此类推。如果批处理失败,您可以捕获错误并找出问题,然后重新插入错误。还有其他方法可以完成这个操作,但这绝对是提供的两个例子的改进。" {: Y( r$ |) I6 f
var iCounter = 0;foreach (Employee item in employees){   if (iCounter == 0cmd.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 >=       cmd.CommitTransaction;     iCounter = if(iCounter > 0)   cmd.CommitTransaction;
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则