记得前段时间帮同事写了个解析账号并入库的小工具,来批量导入账号信息,账号量相当大,程序每读取一条记录便执行一次insert来插入数据,整整跑了一下午才把账号全部入库。

今天又接到同事类似的需求,不过这次的账号量更大,考虑到上次遇到的问题,这次打算采用某种方案来提高插入数据的性能。

了解了下SQLServer批量插入数据的技术,主要有两种:Bulk和表值参数(SQLServer 2008的特性),这两种方式相比循环使用insert插入数据,效率和性能明显上升。使用表值参数带来的提升更为显著。

使用表值参数插入数据的一个例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.IO;
using System.Collections;
using NPOI.HSSF.UserModel;
using System.Data.OleDb;
using System.Data.SqlClient;
using System.Configuration;
using System.Data;namespace Account2DB
{class Program{public static void TableValuedToDB(DataTable dt){SqlConnection sqlConn = new SqlConnection(ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString);const string TSqlStatement ="insert into NewAccount (Account,Ting,Jie)" +" SELECT nc.Account, nc.Ting,nc.Jie" +" FROM @BulkTvp AS nc";SqlCommand cmd = new SqlCommand(TSqlStatement, sqlConn);SqlParameter catParam = cmd.Parameters.AddWithValue("@BulkTvp", dt);catParam.SqlDbType = SqlDbType.Structured;//表值参数的名字叫BulkUdt,在上面的建立测试环境的SQL中有。  catParam.TypeName = "dbo.BulkAccount";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("Account",typeof(string)),  new DataColumn("Ting",typeof(DateTime)),  new DataColumn("Jie",typeof(DateTime))});return dt;}  static void Main(string[] args){Logger.Info("正在插入数据,请稍后...");try{StreamReader sr = new StreamReader(args[0], Encoding.Default);StringBuilder error = new StringBuilder();DataTable dt = GetTableSchema();int count = 0;while (!sr.EndOfStream){string acc = sr.ReadLine();if (acc.StartsWith("账号") || acc.StartsWith("---") || String.IsNullOrEmpty(acc)){continue;}var data = acc.Split(',');if (data.Count() != 3){Logger.Error("错误数据:" + acc);error.AppendLine(acc);}DataRow r = dt.NewRow();r[0] = data[0].Trim();r[1] = Convert.ToDateTime(data[1]);r[2] = Convert.ToDateTime(data[2]);dt.Rows.Add(r);count++;// 每一万个账号作为一批账号插入if (count % 10000 == 0){TableValuedToDB(dt);Logger.Info("已插入:" + count);dt.Clear();}}// 插入剩余账号TableValuedToDB(dt);Logger.Info("已插入:" + count);sr.Close();File.AppendAllText(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "error.txt"), error.ToString(), Encoding.Default);}catch (Exception ex){Logger.Error(ex.ToString());}Logger.Info("执行结束,按任意键关闭...");Console.ReadLine(); }}
}

转载于:https://www.cnblogs.com/jasondan/p/3499246.html

SQLServer使用表值参数,高性能批量插入数据相关推荐

  1. SQLServer 批量插入数据的两种方法

    SQLServer 批量插入数据的两种方法- 发布:dxy 字体:[增加 减小] 类型:转载 在SQL Server 中插入一条数据使用Insert语句,但是如果想要批量插入一堆数据的话,循环使用In ...

  2. sqlserver:使用 SqlBulkCopy 批量插入数据

    环境: window 10 sqlserver 2014 参考: <博文:SqlBulkCopy使用注意事项> 1. 问题场景 在批量迁移或导入数据时,我们可能会遇到插入大量数据的问题,比 ...

  3. MySQL 批量插入数据,单次插入多少条数据效率最高

    文章目录 一.前言 二.批量插入前准备 1.插入到数据表的字段 2.计算一行字段占用的空间 3.在数据里做插入操作的时候,整体时间的分配 三.批量插入数据测试 1.SQL语句的大小限制 2.查看服务器 ...

  4. MySQL 批量插入数据,一次插入多少行数据效率最高?

    一.前言 我们在操作大型数据表或者日志文件的时候经常会需要写入数据到数据库,那么最合适的方案就是数据库的批量插入.只是我们在执行批量操作的时候,一次插入多少数据才合适呢?假如需要插入的数据有百万条,那 ...

  5. 三种批量插入数据的方法

    批量插入数据 本文将介绍三种批量插入数据的方法.第一种方法是使用循环语句逐个将数据项插入到数据库中:第二种方法使用的是SqlBulkCopy,使您可以用其他源的数据有效批量加载 SQL Server ...

  6. SQL Server 批量插入数据方案 SqlBulkCopy 的简单封装,让批量插入更方便

    在线工具 一.Sql Server插入方案介绍 关于 SqlServer 批量插入的方式,有三种比较常用的插入方式,Insert.BatchInsert.SqlBulkCopy,下面我们对比以下三种方 ...

  7. mybatis-plus批量插入数据

    mybatis-plus批量插入数据 saveBatch 这样会非常慢? InsertBatchSomeColumn(批量插入 仅适用于mysql,一次插入多条数据) ruoyi中对BaseMappe ...

  8. oracle insert汉字出错,Oracle数据库之Oracle批量插入数据SQL语句太长出错:无效的主机/绑定变量名...

    本文主要向大家介绍了Oracle数据库之Oracle批量插入数据SQL语句太长出错:无效的主机/绑定变量名,通过具体的内容向大家展现,希望对大家学习Oracle数据库有所帮助. Oracle数据库,用 ...

  9. mysql批量加逗号_批量插入数据到数据库的方式

    出于性能的考虑.用Insert语句一条一条的插入大量数据到数据库肯定不是最好的选择.指不定还会把数据库搞死了. 前几天,用户提了需求,要求写Job实现,每天清空一个Table,然后将新发过来的数据In ...

最新文章

  1. 18香警告:一个女生勿近的邪恶开源项目...
  2. python PyQt5.QtWidgets.QApplication().exec_()函数 QCoreApplication.exec_()(进入主事件循环并等待直到调用exit()为止)
  3. 利用SCVMM 2012 R2来管理Azure虚拟机
  4. ap统计学需要什么计算机,准备AP统计学考试不需要死背公式
  5. html js 如何判断页面是第一次访问还是重复刷新访问,使用JS判断页面是首次被加载还是刷新...
  6. centos7 git安装
  7. 带通滤波器作用和用途_带通滤波器作用
  8. Seata分布式事务问题由来---微服务升级_SpringCloud Alibaba工作笔记0056
  9. 职高学的计算机单招考试能换专业吗,高职单招录取后可以换专业吗
  10. [Swift]LeetCode188. 买卖股票的最佳时机 IV | Best Time to Buy and Sell Stock IV
  11. 【数学分析笔记05】数列极限的性质
  12. 非常好的截图软件:FSCapture,非常非常非常推荐(百度云链接)
  13. oracle 自增长这么使用,Eova Oracle 自增长的处理
  14. 实现Matlab将16进制数据存储到txt文件
  15. lob移表空间 oracle_关于oracle带lob对象的分区表,移动表空间的问题
  16. 2022年烟花爆竹经营单位安全管理人员培训试题及模拟考试
  17. 分子动力学在路面沥青的水污染中的应用
  18. android视频适配与裁剪
  19. 人物志 | 美团技术委员会前端通道主席洪磊:爱折腾的斜杠青年
  20. 在线升级,下载升级包过程中提示网络异常导致升级失败。

热门文章

  1. c语言字符数组的应用编程,C语言基础(一)
  2. 干货!一文讲清楚电商商品生产和库存的数据分析
  3. 数据分析用这样的可视化报表,秒杀Excel,再也不怕被说low
  4. java魔方游戏代码_java swing实现的魔方小游戏源码附带视频指导运行教程
  5. 小米相机曝光_小米11pro曝光,超级屏+双6400万+骁龙875,不愧是小米旗舰
  6. angular 设置接口调用地址_[译] 关于 Angular 的变化检测,你需要知道的一切
  7. mysql优化笔记,MySQL优化笔记
  8. oracle 主键自增函数_Oracle数据库中创建自增主键的实例教程
  9. 【Caffe】利用log文件绘制loss和accuracy(转载)
  10. P4 数据记录增删查改操作