转:(总结) SQL Server Bulk Insert 批量数据导入

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

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

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

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

* 2. Bulk Insert

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

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

* 3. OPENRORWSET(BULK)函数

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

  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
 INSERT INTO to_table_name SELECT filed_name_list
FROM OPENROWSET(BULK N'path_to_data_file', FORMATFILE=N'path_to_format_file') AS new_table_name

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

  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
SELECT field_name_list INTO temp_table_name
FROM OPENROWSET(BULK N'path_to_data_file', FORMATFILE=N'path_to_format_file') AS new_table_name

下面举一个完整的例子:

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

  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'
-- 创建数据库
CREATE DATABASE [db_mgr]
GO
--创建测试表
USE db_mgr
CREATE TABLE dbo.T_Student(
F_ID [int] IDENTITY(1,1) NOT NULL,
F_Code varchar(10) ,
F_Name varchar(100) ,
F_Memo nvarchar(500) ,
F_Memo2 ntext ,
PRIMARY KEY (F_ID)
)
GO --填充测试数据
Insert Into T_Student(F_Code, F_Name, F_Memo, F_Memo2) select
'code001', 'name001', 'memo001', '备注001' union all select
'code002', 'name002', 'memo002', '备注002' union all select
'code003', 'name003', 'memo003', '备注003' union all select
'code004', 'name004', 'memo004', '备注004' union all select
'code005', 'name005', 'memo005', '备注005' union all select
'code006', 'name006', 'memo006', '备注006'

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

  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;
--开启xp_cmdshell存储过程(开启后有安全隐患)
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;EXEC sp_configure 'xp_cmdshell', 1;
EXEC sp_configure 'show advanced options', 0;
RECONFIGURE;

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

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

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

  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 -- 将表中数据清空
EXEC master..xp_cmdshell 'BCP db_mgr.dbo.T_Student out C:/student.data -f C:/student_fmt.xml -T'
truncate table db_mgr.dbo.T_Student -- 将表中数据清空

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

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

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

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

  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表可以不存在
INSERT INTO db_mgr.dbo.T_Student(F_Code, F_Name) SELECT F_Code, F_Name
FROM OPENROWSET(BULK N'C:/student_c.data', FORMATFILE=N'C:/student_fmt_c.xml') AS new_table_name -- T_Student表必须已存在 SELECT F_Code, F_Name INTO db_mgr.dbo.tt
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

BCP的更多相关文章

  1. bcp 命令实例

    set sql_flow="select Id,',',ApplierName,',',FlowStatus,',',IsApproved,',',CreateTime from *** w ...

  2. sqlserver中BCP命令导入导出

    个人自用导出文本文件命令: bcp [xxDB].[dbo].[xx_tb_name] out d:\temp\xxx.txt -c -t "\t" -T bcp是SQL Serv ...

  3. BCP 数据的导入和导出

    BCP 命令的参数很多,使用 -h 查看帮助信息,注意:参数是区分大小写的 使用BCP命令导出和导入数据常用的参数如下 bcp {[[database_name.][schema_name]].{ta ...

  4. BCP笔记整理(二)

    BCP的基础用法可以参考上一篇:http://www.cnblogs.com/Gin-23333/p/5489889.html 这篇是补充一些有可能会用到,但是出场几率并不算大的几个参数 1.首先是 ...

  5. 笔记整理之BCP

    很多时候,需要批量的导数据,可能大家想到的第一反应就是右键数据库->任务->导入导出数据.但是其实微软自身提供的大容量导入导出工具,有bcp, bulkinsert 之类的也是很好用.今天 ...

  6. BCP导出导入大容量数据实践

    前言 SQL SERVER提供多种不同的数据导出导入的工具,也可以编写SQL脚本,使用存储过程,生成所需的数据文件,甚至可以生成包含SQL语句和数据的脚本文件.各有优缺点,以适用不同的需求.下面介绍大 ...

  7. BCP 导出导入数据(SQL Server)

    BCP指令工具可通过安装SQL Server获得. 1. 根据现有的数据库生成表的format文件(导入导出数据的时候需要) bcp db_test.dbo.Table1 format nul -c ...

  8. 使用BCP导出导入数据

    bcp 实用工具可以在 Microsoft SQL Server 实例和用户指定格式的数据文件间大容量复制数据. 使用 bcp 实用工具可以将大量新行导入 SQL Server 表,或将表数据导出到数 ...

  9. Sybase 数据库bcp out备份重要表数据

    bcp相当于逻辑备份,bcp out导出的文件,bcp in可以导回去. 环境:RHEL 5.5 + Sybase客户端软件 需求:在客户端(Linux)备份服务端(HP-UX)重要配置表数据 1.b ...

随机推荐

  1. 因特网服务的类型(协议),目前最流行的类型是 http协议

    在学习超链接中,在HTML上点击QQ图标时会 自动的启动自己本地QQ客户端,其方法是使用了超链协议 一些常用协议如下: file资源是本地计算机上的文件.格式file:/// ftp通过 FTP访问资 ...

  2. JSP代码加固

    String id = request.getParameter("id"); String id = id.replace("'","") ...

  3. Android自定义View之倒计时Countdown实现

    先看一下效果: 在点击OK键之后,开始倒计时. 实现步骤 1.新建Android工程"CountdownView" 2.自定义Drawable 自定义View并没有直接的用户交互, ...

  4. leetcode 186. Reverse Words in a String II 旋转字符数组 ---------- java

    Given an input string, reverse the string word by word. A word is defined as a sequence of non-space ...

  5. PHP中的运算符---算术运算符、逻辑运算符、赋值运算符、比较运算符

    1.算术运算符 常见的算术运算符 运算类型 运算符 举例 结果 取反运算 - -$a 返回$a的负值 加法运算 + $a + $b 返回$a与$b的和 减法运算 - $a - $b 返回$a与$b的差 ...

  6. js前台加密,java后台解密实现

    参考资料: JS前台加密,java后台解密实现

  7. X86 Socket 通信

    struct txd_socket_handler_t { int fd; }; txd_socket_handler_t *txd_tcp_socket_create() { txd_socket_ ...

  8. java中的反射,知道类名创建类,还可以设置私有属性的值

    刚刚学到了反射,感觉反射的功能好强大,所以想写篇博客记录下自己的学习成果. 利用反射来创建对象. Class c1=Class.forName("test.Person");//通 ...

  9. ExtJs 学习之开篇(三)Ext.grid.Panel表格中的处理

    Ext.grid.Panel Ext.create('Ext.grid.Panel',{        title:'测试表格',        width:400,        height:20 ...

  10. IO:File类(java.io.File)

    public class File extends Object implements Serializable, Comparable<File> 构造方法: public File(S ...