回答

收藏

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

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

我在控制台应用程序中插入数据MS SQL Server 2005数据库。我有一个需要插入的对象列表。我在这里Employee类为例:! O' V* M; M3 U0 ~3 X
List employees;我所能做的就是在一段时间内插入一个对象:7 m2 f* s. p* z. k
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();}或者,我可以像这样建立一个不插入的查询:
2 t+ s) O  S- f$ T( S3 Jstring 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查询字符串是否有限制?
; V1 U" [6 k0 U$ H# t% ^( r4 t; f! ~就性能而言,我不确定一次插入多行是否胜过一次插入一行数据。
* ~/ h0 H0 r! ~* g有没有更好的建议?/ B, d" r9 l9 G2 x" E5 [8 w
                                                               
2 F. ~7 m# q: j+ g( m$ O    解决方案:                                                               
5 o* d  p, G8 Z+ b" q  H                                                                事实上,按照你的写作方式,你的第一选择会更快。
0 A7 a! L7 r8 l+ Q$ D[ol]你的第二个例子中有一个问题。你正在执行它sql =   sql  等等。这将导致为每迭代创建一个新的字符串对象。StringBuilder类)。从技术上讲,你也会在第一个例子中创建一个新的字符串对象,但区别在于它不需要复制之前字符串选项中的所有信息。
: a( p2 ^- @& X2 [根据您的设置方式,SQL Server在最终发送查询时,可能需要查询时进行评估,这肯定需要一些时间来找出它应该做什么。我应该指出,这取决于你需要执行多少插入。n你可能没事,但随着它的增长,你的问题只会变得更糟。
$ e" j5 |: K# o% H6 \: V! |4 Z$ y[/ol]由于SQL  y5 J, u3 M) a* n6 n1 }' l
Server如何处理批量事务,所以批量插入比单个插入快。如果要从C#插入数据时,应使用第一种方法将每500个插入包装并提交一次事务,然后执行以下500个,以此类推。如果批处理失败,您可以捕获错误并找出问题,然后重新插入错误。还有其他方法可以完成这个操作,但这绝对是提供的两个例子的改进。9 U3 d2 n" {! j# H0 [$ v1 [/ y/ W
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;
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则