在线精品99_中国九九盗摄偷拍偷看_91免费版在线观看_91.app_91高清视频在线_99热最新网站

SQL中怎么批量插入数据

140次阅读
没有评论

共计 3804 个字符,预计需要花费 10 分钟才能阅读完成。

SQL 中怎么批量插入数据,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面丸趣 TV 小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

1. 创建表。

2. 创建表值参数类型

我们打开查询分析器,然后在查询分析器中执行下列代码:

Create Type PassportTableType as Table(PassportKey nvarchar(50))

执行成功以后,我们打开企业管理器,按顺序依次展开下列节点 – 数据库、展开可编程性、类型、用户自定义表类型,就可以看到我们创建好的表值类型了如下图所示:

说明我们创建表值类型成功了。

3. 编写存储过程

存储过程的代码为:复制代码 代码如下:
USE [TestInsert] GO /****** Object: StoredProcedure [dbo].[CreatePassportWithTVP] Script Date: 03/02/2010 00:14:45 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO — ============================================= — Author: Kevin — Create date: 2010-3-1 — Description: 创建通行证 — ============================================= Create PROCEDURE [dbo].[CreatePassportWithTVP] @TVP PassportTableType readonly AS BEGIN SET NOCOUNT ON; Insert into Passport(PassportKey) select PassportKey from @TVP END

可能在查询分析器中,智能提示会提示表值类型有问题,会出现红色下划线(见下图),不用理会,继续运行我们的代码,完成存储过程的创建

4. 编写代码调用存储过程。三种数据库的插入方式代码如下,由于时间比较紧,代码可能不那么易读,特别代码我加了些注释。复制代码 代码如下:
using System; using System.Diagnostics; using System.Data; using System.Data.SqlClient; using com.DataAccess; namespace ConsoleAppInsertTest {class Program { static string connectionString = SqlHelper.ConnectionStringLocalTransaction; // 数据库连接字符串 static int count = 1000000; // 插入的条数 static void Main(string[] args) {//long commonInsertRunTime = CommonInsert(); //Console.WriteLine(string.Format( 普通方式插入 {1} 条数据所用的时间是 {0} 毫秒 , commonInsertRunTime, count)); long sqlBulkCopyInsertRunTime = SqlBulkCopyInsert(); Console.WriteLine(string.Format( 使用 SqlBulkCopy 插入 {1} 条数据所用的时间是 {0} 毫秒 , sqlBulkCopyInsertRunTime, count)); long TVPInsertRunTime = TVPInsert(); Console.WriteLine(string.Format( 使用表值方式(TVP)插入 {1} 条数据所用的时间是 {0} 毫秒 , TVPInsertRunTime, count)); } /// summary /// 普通调用存储过程插入数据 /// /summary /// returns /returns private static long CommonInsert() { Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); string passportKey; for (int i = 0; i count; i++) {passportKey = Guid.NewGuid().ToString(); SqlParameter[] sqlParameter = {new SqlParameter( @passport , passportKey) }; SqlHelper.ExecuteNonQuery(connectionString, CommandType.StoredProcedure, CreatePassport , sqlParameter); } stopwatch.Stop(); return stopwatch.ElapsedMilliseconds;} /// summary /// 使用 SqlBulkCopy 方式插入数据 /// /summary /// param name= dataTable /param /// returns /returns private static long SqlBulkCopyInsert() { Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); DataTable dataTable = GetTableSchema(); string passportKey; for (int i = 0; i count; i++) {passportKey = Guid.NewGuid().ToString(); DataRow dataRow = dataTable.NewRow(); dataRow[0] = passportKey; dataTable.Rows.Add(dataRow); } SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(connectionString); sqlBulkCopy.DestinationTableName = Passport sqlBulkCopy.BatchSize = dataTable.Rows.Count; SqlConnection sqlConnection = new SqlConnection(connectionString); sqlConnection.Open(); if (dataTable!=null dataTable.Rows.Count!=0) {sqlBulkCopy.WriteToServer(dataTable); } sqlBulkCopy.Close(); sqlConnection.Close(); stopwatch.Stop(); return stopwatch.ElapsedMilliseconds;} private static long TVPInsert() { Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); DataTable dataTable = GetTableSchema(); string passportKey; for (int i = 0; i count; i++) {passportKey = Guid.NewGuid().ToString(); DataRow dataRow = dataTable.NewRow(); dataRow[0] = passportKey; dataTable.Rows.Add(dataRow); } SqlParameter[] sqlParameter = { new SqlParameter( @TVP , dataTable) }; SqlHelper.ExecuteNonQuery(connectionString, CommandType.StoredProcedure, CreatePassportWithTVP , sqlParameter); stopwatch.Stop(); return stopwatch.ElapsedMilliseconds;} private static DataTable GetTableSchema() { DataTable dataTable = new DataTable(); dataTable.Columns.AddRange(new DataColumn[] {new DataColumn( PassportKey) }); return dataTable; } } }

比较神秘的代码其实就下面这两行,该代码是将一个 dataTable 做为参数传给了我们的存储过程。简单吧。

SqlParameter[] sqlParameter = { new SqlParameter( @TVP , dataTable) };SqlHelper.ExecuteNonQuery(connectionString, CommandType.StoredProcedure,  CreatePassportWithTVP , sqlParameter);
5. 测试并记录测试结果
第一组测试,插入记录数 1000
第二组测试,插入记录数 10000
第三组测试,插入记录数 1000000

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注丸趣 TV 行业资讯频道,感谢您对丸趣 TV 的支持。

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-03发表,共计3804字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)
主站蜘蛛池模板: 欧美成人伊人久久综合网 | 美女被视频网站在线看九色 | 99视频精品在线 | 在线精品国产一区二区 | 午夜伦4480yy私人影院 | 亚洲精品成人av观看 | 国产三级精品三级在专区 | 国产露脸精彩对白一区 | 国内精品久久久久久99蜜桃 | 中文在线1区二区六区 | 中文第一页 | 国产一久久香蕉国产线看观看 | 亚洲精品乱码久久久久久v 亚洲精品乱码久久久久久按摩 | 欧美在线va在线播放 | 一出一进一爽一粗一大视频免费的 | 日韩中文字幕免费视频 | 两个人www在线观看免费视频 | 欧美一区亚洲二区 | www男人天堂| 日本a级片网站 | 亚洲自偷自偷图片 | 国产成年无码久久久久毛片 | 黄色美女在线观看 | 欧美激情一区二区三区 | 又硬又粗又大一区二区三区视频 | 免费网站看av片 | 欧美性大战xxxxx久久久√ | 一边添奶一边添p好爽视频 一插综合网 | 久久精品二三区 | 依人九九| 国产精品免费观看调教网 | 国产a不卡 | 国产精品186在线观看在线播放 | 国产亚洲婷婷香蕉久久精品 | 九九99香蕉在线视频网站 | 人妻无码中文字幕免费视频蜜桃 | 亚洲欧美小说图片 | 一级特级aaaa毛片免费观看 | 风流少妇按摩来高潮 | 中文字幕曰韩一区二区不卡 | 十八禁视频网站在线观看 |