回答

收藏

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

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

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

本版积分规则