≡
  • 网络编程
  • 数据库
  • CMS技巧
  • 软件编程
  • PHP笔记
  • JavaScript
  • MySQL
位置:首页 > 数据库 > SQL Server

SQL Server 批量插入数据的两种方法

人气:421 时间:2019-06-06

这篇文章主要为大家详细介绍了SQL Server 批量插入数据的两种方法,具有一定的参考价值,可以用来参考一下。

感兴趣的小伙伴,下面一起跟随四海网的小编两巴掌来看看吧!

运行下面的脚本,建立测试数据库和表值参数。

代码如下:


--Create DataBase 
create database BulkTestDB; 
go 
use BulkTestDB; 
go 
--Create Table 
Create table BulkTestTable( 
Id int primary key, 
UserName nvarchar(32), 
Pwd varchar(16)) 
go 
--Create Table Valued 
CREATE TYPE BulkUdt AS TABLE 
(Id int, 
UserName nvarchar(32), 
Pwd varchar(16))

下面我们使用最简单的Insert语句来插入100万条数据,代码如下:

代码如下:


Stopwatch sw = new Stopwatch(); 

SqlConnection sqlConn = new SqlConnection( 
ConfigurationManager.ConnectionStrings["ConnStr"].ConnectionString);//连接数据库 

SqlCommand sqlComm = new SqlCommand(); 
sqlComm.CommandText = string.Format("insert into BulkTestTable(Id,UserName,Pwd)values(@p0,@p1,@p2)");//参数化SQL 
sqlComm.Parameters.Add("@p0", SqlDbType.Int); 
sqlComm.Parameters.Add("@p1", SqlDbType.NVarChar); 
sqlComm.Parameters.Add("@p2", SqlDbType.VarChar); 
sqlComm.CommandType = CommandType.Text; 
sqlComm.Connection = sqlConn; 
sqlConn.Open(); 
try 
{ 
//循环插入100万条数据,每次插入10万条,插入10次。 
for (int multiply = 0; multiply < 10; multiply++) 
{ 
for (int count = multiply * 100000; count < (multiply + 1) * 100000; count++) 
{ 

sqlComm.Parameters["@p0"].Value = count; 
sqlComm.Parameters["@p1"].Value = string.Format("User-{0}", count * multiply); 
sqlComm.Parameters["@p2"].Value = string.Format("Pwd-{0}", count * multiply); 
sw.Start(); 
sqlComm.ExecuteNonQuery(); 
sw.Stop(); 
} 
//每插入10万条数据后,显示此次插入所用时间 
Console.WriteLine(string.Format("Elapsed Time is {0} Milliseconds", sw.ElapsedMilliseconds)); 
} 
} 
catch (Exception ex) 
{ 
throw ex; 
} 
finally 
{ 
sqlConn.Close(); 
} 

Console.ReadLine();
 

耗时图如下:

【图片暂缺】

由于运行过慢,才插入10万条就耗时72390 milliseconds,所以我就手动强行停止了。

下面看一下使用Bulk插入的情况:

bulk方法主要思想是通过在客户端把数据都缓存在Table中,然后利用SqlBulkCopy一次性把Table中的数据插入到数据库

代码如下:

代码如下:


public static void BulkToDB(DataTable dt) 
{ 
SqlConnection sqlConn = new SqlConnection( 
ConfigurationManager.ConnectionStrings["ConnStr"].ConnectionString); 
SqlBulkCopy bulkCopy = new SqlBulkCopy(sqlConn); 
bulkCopy.DestinationTableName = "BulkTestTable"; 
bulkCopy.BatchSize = dt.Rows.Count; 

try 
{ 
sqlConn.Open(); 
    if (dt != null && dt.Rows.Count != 0) 
    bulkCopy.WriteToServer(dt); 
} 
catch (Exception ex) 
{ 
throw ex; 
} 
finally 
{ 
sqlConn.Close(); 
if (bulkCopy != null) 
bulkCopy.Close(); 
} 
} 

public static DataTable GetTableSchema() 
{ 
DataTable dt = new DataTable(); 
dt.Columns.AddRange(new DataColumn[]{ 
new DataColumn("Id",typeof(int)), 
new DataColumn("UserName",typeof(string)), 
    new DataColumn("Pwd",typeof(string))}); 

return dt; 
} 

static void Main(string[] args) 
{ 
Stopwatch sw = new Stopwatch(); 
for (int multiply = 0; multiply < 10; multiply++) 
{ 
DataTable dt = Bulk.GetTableSchema(); 
for (int count = multiply * 100000; count < (multiply + 1) * 100000; count++) 
{ 
DataRow r = dt.NewRow(); 
r[0] = count; 
r[1] = string.Format("User-{0}", count * multiply); 
r[2] = string.Format("Pwd-{0}", count * multiply); 
dt.Rows.Add(r); 
} 
sw.Start(); 
Bulk.BulkToDB(dt); 
sw.Stop(); 
Console.WriteLine(string.Format("Elapsed Time is {0} Milliseconds", sw.ElapsedMilliseconds)); 
} 

Console.ReadLine(); 
}

耗时图如下:
【图片暂缺】

可见,使用Bulk后,效率和性能明显上升。使用Insert插入10万数据耗时72390,而现在使用Bulk插入100万数据才耗时17583。

最后再看看使用表值参数的效率,会另你大为惊讶的。

表值参数是SQL Server 2008新特性,简称TVPs。对于表值参数不熟悉的朋友,可以参考最新的book online,我也会另外写一篇关于表值参数的博客,不过此次不对表值参数的概念做过多的介绍。言归正传,看代码:

代码如下:


public static void TableValuedToDB(DataTable dt) 
{ 
SqlConnection sqlConn = new SqlConnection( 
ConfigurationManager.ConnectionStrings["ConnStr"].ConnectionString); 
const string TSqlStatement = 
"insert into BulkTestTable (Id,UserName,Pwd)" + 
" SELECT nc.Id, nc.UserName,nc.Pwd" + 
" FROM @NewBulkTestTvp AS nc"; 
SqlCommand cmd = new SqlCommand(TSqlStatement, sqlConn); 
SqlParameter catParam = cmd.Parameters.AddWithValue("@NewBulkTestTvp", dt); 
catParam.SqlDbType = SqlDbType.Structured; 
//表值参数的名字叫BulkUdt,在上面的建立测试环境的SQL中有。 
catParam.TypeName = "dbo.BulkUdt"; 
try 
{ 
sqlConn.Open(); 
if (dt != null && dt.Rows.Count != 0) 
{ 
cmd.ExecuteNonQuery(); 
} 
} 
catch (Exception ex) 
{ 
throw ex; 
} 
finally 
{ 
sqlConn.Close(); 
} 
} 

public static DataTable GetTableSchema() 
{ 
DataTable dt = new DataTable(); 
dt.Columns.AddRange(new DataColumn[]{ 
new DataColumn("Id",typeof(int)), 
new DataColumn("UserName",typeof(string)), 
new DataColumn("Pwd",typeof(string))}); 

return dt; 
} 

static void Main(string[] args) 
{ 
Stopwatch sw = new Stopwatch(); 
for (int multiply = 0; multiply < 10; multiply++) 
{ 
DataTable dt = TableValued.GetTableSchema(); 
for (int count = multiply * 100000; count < (multiply + 1) * 100000; count++) 
{ 
DataRow r = dt.NewRow(); 
r[0] = count; 
r[1] = string.Format("User-{0}", count * multiply); 
r[2] = string.Format("Pwd-{0}", count * multiply); 
dt.Rows.Add(r); 
} 
sw.Start(); 
TableValued.TableValuedToDB(dt); 
sw.Stop(); 
Console.WriteLine(string.Format("Elapsed Time is {0} Milliseconds", sw.ElapsedMilliseconds)); 
} 

Console.ReadLine(); 
}
 

 

耗时图如下:

【图片暂缺】

比Bulk还快5秒。
此文原创自CSDN TJVictor

本文来自:http://www.q1010.com/179/7600-0.html

注:关于SQL Server 批量插入数据的两种方法的内容就先介绍到这里,更多相关文章的可以留意四海网的其他信息。

关键词:SQL SERVER

您可能感兴趣的文章

  • 用户"sa"登陆失败 SQLServer 错误18456的解决方法
  • SQL Server做购物车系统时利用到得几个sqlserver 存储过程
  • SQLServer 优化SQL语句 in 和not in的替代方案
  • win2003 安装 sqlserver 2005的方法
  • SQL Server当恢复sqlserver bak文件时,原始的用户无法删除的解决方法
  • SQL Server分页存储过程(三)在sqlserver中打造更加准确的分页结果
  • 分页存储过程(二)在sqlserver中返回更加准确的分页结果
  • SQLServer上查看SQL语句的执行时间的方法
  • SQL Server 2000数据库同步 同步两个SQLServer数据库的内容
  • SQLServer触发器创建、删除、修改、查看示例代码
上一篇:SQL Server 修复断电等损坏的SQL 数据库
下一篇:SQL Server XML数据的五种基本操作
热门文章
  • SQL Server SQL获取第一条记录的方法
  • SQL Server出现System.OutOfMemoryException异常的解决方法
  • SQL Server的 update from 语句的简单示例
  • SQL Server 数据库备份方法菜鸟教程
  • SQL Server 多表关联时在where语句中慎用trim()方法
  • SQL Server数据类型及长度限制详细说明
  • mybaits非配置原因,导致SqlSession was not registered for synchronization异常解析
  • SQL Server 收缩后对数据库的使用有影响吗?
  • SQL Server 格式导致的Excel导入sql出现异常的解决方法
  • SQL Server 连接服务器出现错误 7391的解决方法
  • 最新文章
    • SQL Server存储过程基本语法的简单示例
    • sql查询时增加自动编号和分页的简单示例
    • sql轻松应付百万数据的高效数据分页存储过程的简单示例
    • sql获取一条数据中所有字段的名称和值的实现方法
    • sql分割函数的简单示例
    • SQL Server异常捕获的简单示例
    • SQL SERVER回滚恢复误操作数据的实现方法
    • SQL Server函数或存储过程中抛出异常的实现方法
    • SQL Server创建数据库的完整代码
    • SQL Server创建数据库的命令用法示例

四海网收集整理一些常用的php代码,JS代码,数据库mysql等技术文章。