




已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
SQL Server 批量插入数据的两种方法 在SQL Server 中插入一条数据使用Insert语句,但是如果想要批量插入一堆数据的话,循环使用Insert不仅效率低,而且会导致SQL一系统性能问题。下面介绍SQL Server支持的两种批量数据插入方法:Bulk和表值参数(Table-Valued Parameters)。运行下面的脚本,建立测试数据库和表值参数。1. -CreateDataBase2. createdatabaseBulkTestDB;3. go4. useBulkTestDB;5. go6. -CreateTable7. CreatetableBulkTestTable(8. Idintprimarykey,9. UserNamenvarchar(32),10. Pwdvarchar(16)11. go12. -CreateTableValued13. CREATETYPEBulkUdtASTABLE14. (Idint,15. UserNamenvarchar(32),16. Pwdvarchar(16)下面我们使用最简单的Insert语句来插入100万条数据,代码如下:1. Stopwatchsw=newStopwatch();2. 3. SqlConnectionsqlConn=newSqlConnection(4. ConfigurationManager.ConnectionStringsConnStr.ConnectionString);/连接数据库5. 6. SqlCommandsqlComm=newSqlCommand();7. sqlComm.CommandText=string.Format(insertintoBulkTestTable(Id,UserName,Pwd)values(p0,p1,p2);/参数化SQL8. sqlComm.Parameters.Add(p0,SqlDbType.Int);9. sqlComm.Parameters.Add(p1,SqlDbType.NVarChar);10. sqlComm.Parameters.Add(p2,SqlDbType.VarChar);11. sqlComm.CommandType=CommandType.Text;12. sqlComm.Connection=sqlConn;13. sqlConn.Open();14. try15. 16. /循环插入100万条数据,每次插入10万条,插入10次。17. for(intmultiply=0;multiply10;multiply+)18. 19. for(intcount=multiply*100000;count(multiply+1)*100000;count+)20. 21. 22. sqlComm.Parametersp0.Value=count;23. sqlComm.Parametersp1.Value=string.Format(User-0,count*multiply);24. sqlComm.Parametersp2.Value=string.Format(Pwd-0,count*multiply);25. sw.Start();26. sqlComm.ExecuteNonQuery();27. sw.Stop();28. 29. /每插入10万条数据后,显示此次插入所用时间30. Console.WriteLine(string.Format(ElapsedTimeis0Milliseconds,sw.ElapsedMilliseconds);31. 32. 33. catch(Exceptionex)34. 35. throwex;36. 37. finally38. 39. sqlConn.Close();40. 41. 42. Console.ReadLine();耗时图如下:由于运行过慢,才插入10万条就耗时72390 milliseconds,所以我就手动强行停止了。下面看一下使用Bulk插入的情况:bulk方法主要思想是通过在客户端把数据都缓存在Table中,然后利用SqlBulkCopy一次性把Table中的数据插入到数据库代码如下:1. publicstaticvoidBulkToDB(DataTabledt)2. 3. SqlConnectionsqlConn=newSqlConnection(4. ConfigurationManager.ConnectionStringsConnStr.ConnectionString);5. SqlBulkCopybulkCopy=newSqlBulkCopy(sqlConn);6. bulkCopy.DestinationTableName=BulkTestTable;7. bulkCopy.BatchSize=dt.Rows.Count;8. 9. try10. 11. sqlConn.Open();12. if(dt!=null&dt.Rows.Count!=0)13. bulkCopy.WriteToServer(dt);14. 15. catch(Exceptionex)16. 17. throwex;18. 19. finally20. 21. sqlConn.Close();22. if(bulkCopy!=null)23. bulkCopy.Close();24. 25. 26. 27. publicstaticDataTableGetTableSchema()28. 29. DataTabledt=newDataTable();30. dt.Columns.AddRange(newDataColumn31. newDataColumn(Id,typeof(int),32. newDataColumn(UserName,typeof(string),33. newDataColumn(Pwd,typeof(string);34. 35. returndt;36. 37. 38. staticvoidMain(stringargs)39. 40. Stopwatchsw=newStopwatch();41. for(intmultiply=0;multiply10;multiply+)42. 43. DataTabledt=Bulk.GetTableSchema();44. for(intcount=multiply*100000;count(multiply+1)*100000;count+)45. 46. DataRowr=dt.NewRow();47. r0=count;48. r1=string.Format(User-0,count*multiply);49. r2=string.Format(Pwd-0,count*multiply);50. dt.Rows.Add(r);51. 52. sw.Start();53. Bulk.BulkToDB(dt);54. sw.Stop();55. Console.WriteLine(string.Format(ElapsedTimeis0Milliseconds,sw.ElapsedMilliseconds);56. 57. 58. Console.ReadLine();59. 耗时图如下:可见,使用Bulk后,效率和性能明显上升。使用Insert插入10万数据耗时72390,而现在使用Bulk插入100万数据才耗时17583。最后再看看使用表值参数的效率,会另你大为惊讶的。表值参数是SQL Server 2008新特性,简称TVPs。对于表值参数不熟悉的朋友,可以参考最新的book online,我也会另外写一篇关于表值参数的博客,不过此次不对表值参数的概念做过多的介绍。言归正传,看代码:view plaincopy to clipboardprint?1. publicstaticvoidTableValuedToDB(DataTabledt)2. 3. SqlConnectionsqlConn=newSqlConnection(4. ConfigurationManager.ConnectionStringsConnStr.ConnectionString);5. conststringTSqlStatement=6. insertintoBulkTestTable(Id,UserName,Pwd)+7. SELECTnc.Id,nc.UserName,nc.Pwd+8. FROMNewBulkTestTvpASnc;9. SqlCommandcmd=newSqlCommand(TSqlStatement,sqlConn);10. SqlParametercatParam=cmd.Parameters.AddWithValue(NewBulkTestTvp,dt);11. catParam.SqlDbType=SqlDbType.Structured;12. /表值参数的名字叫BulkUdt,在上面的建立测试环境的SQL中有。13. catParam.TypeName=dbo.BulkUdt;14. try15. 16. sqlConn.Open();17. if(dt!=null&dt.Rows.Count!=0)18. 19. cmd.ExecuteNonQuery();20. 21. 22. catch(Exceptionex)23. 24. throwex;25. 26. finally27. 28. sqlConn.Close();29. 30. 31. 32. publicstaticDataTableGetTableSchema()33. 34. DataTabledt=newDataTable();35. dt.Columns.AddRange(newDataColumn36. newDataColumn(Id,typeof(int),37. newDataColumn(UserName,typeof(string),38. newDataColumn(Pwd,typeof(string);39. 40. returndt;41. 42. 43. staticvoidMain(stringargs)44. 45. Stopwatchsw=newStopwatch();46. for(intmultiply=0;multiply10;multiply+)47. 48. DataTabledt=TableValued.GetTableSchema();49. for(intcount=multiply*100000;count(multiply+1)*100000;count+)50. 51. DataRowr=dt.NewRow();52. r0=count;53. r1=string.Format(User-0,count*multiply);54. r2=string.Format(Pwd-0,count*multiply);55. dt.Rows.Add(r);56. 57. sw.Start();58. TableValued.TableValuedT
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中策职业学校钱塘学校钱塘校区设备项目网络攻防实训室项目(一期)招标文件
- 住宅专项维修资金管理基础信息数据标准
- 养老院事故灾难应急预案范文(35篇)
- 海南省省级直辖县级行政区划文昌市2024-2025学年七年级下学期期末质量检测道德与法治试题(无答案)
- 5.1文明有礼(教学设计) 2025-2026学年统编版道德与法治八年级上册
- 2025一建《建设工程项目管理》考前速记100点
- 2025年安徽省专业技术继续教育公需科目考试及答案
- 2024年高职单招全真模拟模拟题附参考答案详解(培优B卷)
- 2024年执法资格通关考试题库附参考答案详解【综合卷】
- 2025年保靖县事业单位教育类引进高层次急需紧缺人才15人笔试备考试题含答案详解(突破训练)
- 工业控制系统的安全风险评估
- 地图拼图活动方案
- 胡蜂蛰伤培训课件
- JJF 2215-2025 移动源排放颗粒物数量检测仪校准规范
- 2025年天津市中考英语试卷(含标准答案)
- 智慧审计数字化场景DeepSeek+AI智算一体机设计方案
- 机械清扫队管理制度
- 第16课《田忌赛马》课件
- 陕西省专业技术人员继续教育2025公需课《党的二十届三中全会精神解读与高质量发展》20学时题库及答案
- 普洱茶考试题及答案
- 节目演出安全协议书
评论
0/150
提交评论