SQL中怎么批量插入数据

42次阅读
没有评论

共计 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字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)