SQL Server的Bulk Insert语句可以将本地或远程的数据文件批量导入到数据库中,速度非常的快。远程文件必须共享才行,文件路径须使用通用约定(UNC)名称,即"\\服务器名或IP\共享名\路径\文件名"的形式。

* 1. 由于Bulk Insert通常配合格式化文件批量导入数据更方便,所以这里先介绍bcp工具导出格式化文件的方法。

bcp是SQL Server提供的命令行实用工具提供了数据的导出、导入、格式文件导出等功能,导出格式化文件的语法如下:

Sql代码

  1. bcp 数据库名.用户名.表名 format nul -- 这里的nul必须存在,用于不是导出和导入数据的情况下
  2. -f 输出的格式化文件名 [-x] -c  -- -x参数指定输出的格式文件为xml格式(默认非xml格式); -c参数指定数据存储方式为字符,并默认指定'\t'作为字段间隔符;'\n'作为行间隔符
  3. [-t 字段间隔符] [-r 行间隔符号]  -- -t与-r参数可选,用于覆盖-c指定的默认间隔符
  4. -T -- 指定数据库连接可信,即使用Windows身份登录

* 2. Bulk Insert

根据格式文件导入数据文件,语法格式如下:

Sql代码

  1. Bulk insert 数据库名.用户名.表名
  2. from '数据文件路径'
  3. with
  4. (
  5. formatfile = '格式文件路径',
  6. FirstRow = 2    --指定数据文件中开始的行数,默认是1
  7. )

* 3. OPENRORWSET(BULK)函数

有时,使用OPENROWSET(BULK)函数可以更灵活地选取想要的字段插入到原表或者其他表中,其语法格式为:

Sql代码

  1. INSERT INTO to_table_name SELECT filed_name_list
  2. FROM OPENROWSET(BULK N'path_to_data_file', FORMATFILE=N'path_to_format_file') AS new_table_name

当然,该函数也可以这么使用:

Sql代码

  1. SELECT field_name_list INTO temp_table_name
  2. FROM OPENROWSET(BULK N'path_to_data_file', FORMATFILE=N'path_to_format_file') AS new_table_name

下面举一个完整的例子:

1)创建数据库、表并填充测试数据,脚本如下:

Sql代码

  1. -- 创建数据库
  2. CREATE DATABASE [db_mgr]
  3. GO
  4. --创建测试表
  5. USE db_mgr
  6. CREATE TABLE dbo.T_Student(
  7. F_ID [int] IDENTITY(1,1) NOT NULL,
  8. F_Code varchar(10) ,
  9. F_Name varchar(100) ,
  10. F_Memo nvarchar(500) ,
  11. F_Memo2 ntext ,
  12. PRIMARY KEY  (F_ID)
  13. )
  14. GO
  15. --填充测试数据
  16. Insert Into T_Student(F_Code, F_Name, F_Memo, F_Memo2) select
  17. 'code001', 'name001', 'memo001', '备注001' union all select
  18. 'code002', 'name002', 'memo002', '备注002' union all select
  19. 'code003', 'name003', 'memo003', '备注003' union all select
  20. 'code004', 'name004', 'memo004', '备注004' union all select
  21. 'code005', 'name005', 'memo005', '备注005' union all select
  22. 'code006', 'name006', 'memo006', '备注006'

2)我们可以使用SQL Server的master..xp_cmdshell存储过程将CMD的命令传给系统,这样就可以直接在SQL Server的查询处理器中直接输入bcp的命令,而不用切换到命令模式下执行。SQL Server 出于安全目的默认将该存储过程禁用了,开启方法如下:

Sql代码

  1. --开启xp_cmdshell存储过程(开启后有安全隐患)
  2. EXEC sp_configure 'show advanced options', 1;
  3. RECONFIGURE;EXEC sp_configure 'xp_cmdshell', 1;
  4. EXEC sp_configure 'show advanced options', 0;
  5. RECONFIGURE;

3)使用bcp导出格式文件:

Sql代码

  1. EXEC master..xp_cmdshell 'BCP db_mgr.dbo.T_Student format nul -f C:/student_fmt.xml -x -c -T'

4)使用bcp导出数据文件:

Sql代码

  1. EXEC master..xp_cmdshell 'BCP db_mgr.dbo.T_Student out C:/student.data -f C:/student_fmt.xml -T'
  2. truncate table db_mgr.dbo.T_Student -- 将表中数据清空

注意:在实际使用过程中,数据文件可以由程序生成,如日志记录等!

5)使用Bulk Insert语句批量导入数据文件:

Sql代码

  1. BULK INSERT db_mgr.dbo.T_Student
  2. FROM 'C:/student.data'
  3. WITH
  4. (
  5. FORMATFILE = 'C:/student_fmt.xml'
  6. )

6)使用OPENROWSET(BULK)的例子:

Sql代码

  1. INSERT INTO db_mgr.dbo.T_Student(F_Code, F_Name) SELECT F_Code, F_Name
  2. FROM OPENROWSET(BULK N'C:/student_c.data', FORMATFILE=N'C:/student_fmt_c.xml') AS new_table_name -- T_Student表必须已存在
  3. SELECT F_Code, F_Name INTO db_mgr.dbo.tt
  4. FROM OPENROWSET(BULK N'C:/student_c.data', FORMATFILE=N'C:/student_fmt_c.xml') AS new_table_name -- tt表可以不存在

参考:

使用 BULK INSERT 或 OPENROWSET(BULK...) 导入大容量数据(尤其是关于安全的那部分,导入远程文件时应特别注意):

http://msdn.microsoft.com/zh-cn/library/ms175915.aspx

创建格式化文件:

http://msdn.microsoft.com/zh-cn/library/ms191516.aspx

OPENROWSET (Transact-SQL):

http://msdn.microsoft.com/zh-cn/library/ms190312.aspx

BULK INSERT (Transact-SQL):

http://msdn.microsoft.com/zh-cn/library/ms188365.aspx

bcp 实用工具:

http://msdn.microsoft.com/zh-cn/library/ms162802.aspx

SqlServer批量导入的更多相关文章

  1. 大数据批量导入,解决办法,实践从定时从 sqlserver 批量同步数据到 mySql

    c#代码,批量导入数据代码 public class MySql_Target : ZFCommon.DataAccesser.Base.DABase { public MySql_Target() ...

  2. SQLSERVER:大容量导入数据时保留标识值 (SQL Server)

    从MSDN上看到实现大容量导入数据时保留标识值得方法包含三种: MSDN链接地址为:https://msdn.microsoft.com/zh-cn/library/ms178129.aspx 感觉M ...

  3. mysql中把一个表的数据批量导入另一个表中

    mysql中把一个表的数据批量导入另一个表中   不管是在网站开发还是在应用程序开发中,我们经常会碰到需要将MySQL或MS SQLServer某个表的数据批量导入到另一个表的情况,甚至有时还需要指定 ...

  4. .net core利用MySqlBulkLoader大数据批量导入MySQL

    最近用core写了一个数据迁移小工具,从SQLServer读取数据,加工后导入MySQL,由于数据量太过庞大,数据表都过百万,常用的dapper已经无法满足.三大数据库都有自己的大数据批量导入数据的方 ...

  5. 随笔编号-09 批量导入数据(Mysql)报MySQL server has gone away 问题的解决方法

    问题场景: 使用*.sql 脚本,批量导入数据到mysql实例中,使用DOS 界面导入的,期间,到最后一步 source D:\aaa.sql  回车后,系统提示 MySQL server has g ...

  6. Elasticsearch —— bulk批量导入数据

    在使用Elasticsearch的时候,一定会遇到这种场景--希望批量的导入数据,而不是一条一条的手动导入.那么此时,就一定会需要bulk命令! 更多内容参考我整理的Elk教程 bulk批量导入 批量 ...

  7. MS SQLServer 批量附加数据库 分类: SQL Server 数据库 2015-07-13 11:12 30人阅读 评论(0) 收藏

    ************************************************************ * 标题:MS SQLServer 批量附加数据库 * 说明:请根据下面的注释 ...

  8. Shp数据批量导入Postgresql工具的原理和设计

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.背景 在制作整体的开源工具箱产品中,数据入库是一个重要的环节.虽然 ...

  9. [Django]网页中利用ajax实现批量导入数据功能

    url.py代码: url(r'^workimport/$', 'keywork.views.import_keywork', name='import_keywork') view.py代码: fr ...

随机推荐

  1. 第三十一节,time时间模块

    模块简介 模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需要 ...

  2. 深入理解JAVA的多态性[转]

    昨天看到一个关于多态性的帖子,参考了回帖者的理解,加入了一些自己的看法,整理出来供大家参考,不一定完全正确,欢迎大家批评指正. (一)相关类 class A ...{         public S ...

  3. hdu_5707_Combine String("巴卡斯杯" 中国大学生程序设计竞赛 - 女生专场)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5707 题意:给你三个字符串 a,b,c,问你 c能否拆成a,b,a,b串的每一个字符在c中不能变 题解 ...

  4. SSH登录很慢问题的解决方法

    用ssh连其他linux机器,会等待10-30秒才有提示输入密码.严重影响工作效率. 关闭ssh的gssapi认证 用ssh -v user@server 可以看到登录时有如下信息: debug1: ...

  5. 剑指offer 旋转数组

    class Solution { public: int minNumberInRotateArray(vector<int> rotateArray) { //常规的遍历方法时间是O(N ...

  6. 二分 Intel Code Challenge Elimination Round (Div.1 + Div.2, combined) D

    http://codeforces.com/contest/722/problem/D 题目大意:给你一个没有重复元素的Y集合,再给你一个没有重复元素X集合,X集合有如下操作 ①挑选某个元素*2 ②某 ...

  7. 转 由一次磁盘告警引发的血案:du 和 ls 的区别

    如果你完全不明白或者完全明白图片含义, 那么你不用继续往下看了. 否则, 这篇文章也许正是你需要的. 背景 确切地说,不是收到的自动告警短信或者邮件告诉我某机器上的磁盘满了,而是某同学人肉发现该机器写 ...

  8. Hibernate 系列教程1-枚举单例类

    你还在为不知道怎样正确使用Hibernate而纠结吗 你还在为不知道怎样配置映射文件而郁闷吗 枚举单例(Enum Singleton) 是实现单例模式的一种方式而已,不过写法简单,创建枚举默认也是线程 ...

  9. jquer 带左右按钮滚动图片 点击显示大图

    <style> ul{ list-style:none; padding:0px; margin:0px;} li{ list-style:none; padding:0px; margi ...

  10. Swift 学习笔记 (一)

    原创: 转载请注明出处 Extention try catch rxSwift internal  public  private var  let as       as? 强转 ? ! didSe ...