回答

收藏

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

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

我在控制台应用程序中插入数据MS SQL Server 2005数据库。我有一个需要插入的对象列表。我在这里Employee类为例:4 x& f3 ~* U  D: x: C8 ?
List employees;我所能做的就是在一段时间内插入一个对象:
" q, T* X: b1 j# L# J/ `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();}或者,我可以像这样建立一个不插入的查询:
, W$ x, _  y- k: Z: @8 i  {4 e/ sstring 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查询字符串是否有限制?  l0 _7 G, Z- m& y- o2 \
就性能而言,我不确定一次插入多行是否胜过一次插入一行数据。( S9 s) ?& b  D. @' A! z) ~
有没有更好的建议?
2 X7 u6 S) @/ ^7 x* e+ A& i                                                               
9 [( o# U& v% `    解决方案:                                                               
' x7 w5 e) F" F  U                                                                事实上,按照你的写作方式,你的第一选择会更快。3 Z" i- }7 N1 L5 N% _
[ol]你的第二个例子中有一个问题。你正在执行它sql =   sql  等等。这将导致为每迭代创建一个新的字符串对象。StringBuilder类)。从技术上讲,你也会在第一个例子中创建一个新的字符串对象,但区别在于它不需要复制之前字符串选项中的所有信息。
# d, b$ i" V% y/ U! |( R根据您的设置方式,SQL Server在最终发送查询时,可能需要查询时进行评估,这肯定需要一些时间来找出它应该做什么。我应该指出,这取决于你需要执行多少插入。n你可能没事,但随着它的增长,你的问题只会变得更糟。4 q% K: u; w7 U' [* f# J4 C
[/ol]由于SQL
- o. j* G5 j) r$ l) H5 W" }Server如何处理批量事务,所以批量插入比单个插入快。如果要从C#插入数据时,应使用第一种方法将每500个插入包装并提交一次事务,然后执行以下500个,以此类推。如果批处理失败,您可以捕获错误并找出问题,然后重新插入错误。还有其他方法可以完成这个操作,但这绝对是提供的两个例子的改进。6 k  \* i# c* I& z6 Y* f3 c1 K
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;
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则