SQL Server
数据导入导出工具BCP详解
bcp
是
SQL Server
中负责导入导出数据的一个命令行工具,它是基于
DB-Library
的,并且能以并行的方式高效地导入导出大批量的数据。
bcp
可以将数据库的表或视图直接导出,也能通过
SELECT FROM
语句对表或视图进行过滤后导出。在导入导出数据时,可以使用默认值或是使用一个格式文件将文件中的数据导入到数据库或将数据库中的数据导出到文件中。下面将详细讨论如何利用
bcp
导入导出数据。
1. bcp
的主要参数介绍
bcp
共有四个动作可以选择。
(1)
导入。
这个动作使用
in
命令完成,后面跟需要导入的文件名。
(2)
导出。
这个动作使用
out
命令完成,后面跟需要导出的文件名。
(3)
使用
SQL
语句导出。
这个动作使用
queryout
命令完成,它跟
out
类似,只是数据源不是表或视图名,而是
SQL
语句。
(4)
导出格式文件。
这个动作使用
format
命令完成,后而跟格式文件名。
下面介绍一些常用的选项:
-f format_file
format_file
表示格式文件名。这个选项依赖于上述的动作,如果使用的是
in
或
out
,
format_file
表示已经存在的格式文件,如果使用的是
format
则表示是要生成的格式文件。
-x
这个选项要和
-f format_file
配合使用,以便生成
xml
格式的格式文件。
-F first_row
指定从被导出表的哪一行导出,或从被导入文件的哪一行导入。
-L last_row
指定被导出表要导到哪一行结束,或从被导入文件导数据时,导到哪一行结束。
-c
使用
char
类型做为存储类型,没有前缀且以
"/t"
做为字段分割符,以
"/n"
做为行分割符。
-w
和
-c
类似,只是当使用
Unicode
字符集拷贝数据时使用,且以
nchar
做为存储类型。
-t field_term
指定字符分割符,默认是
"/t"
。
-r row_term
指定行分割符,默认是
"/n"
。
-S server_name[ /instance_name]
指定要连接的
SQL Server
服务器的实例,如果未指定此选项,
bcp
连接本机的
SQL Server
默认实例。如果要连接某台机器上的默认实例,只需要指定机器名即可。
-U login_id
指定连接
SQL Sever
的用户名。
-P password
指定连接
SQL Server
的用户名密码。
-T
指定
bcp
使用信任连接登录
SQL Server
。如果未指定
-T
,必须指定
-U
和
-P
。
-k
指定空列使用
null
值插入,而不是这列的默认值。
2.
如何使用
bcp
导出数据
(1)
使用
bcp
导出整个表或视图。
bcp AdventureWorks.sales.currency out c:/currency1.txt -c -U"sa" -P"password" --
使用密码连接或
bcp AdventureWorks.sales.currency out c:/currency1.txt -c -T --
使用信任连接
下面是上述命令执行后的输出结果
Starting copy...
105 rows copied.
Network packet size (bytes): 4096
Clock Time (ms.) Total : 10 Average : (10500.00 rows per sec.)
下面是
currency1.txt
的部分内容
AED Emirati Dirham 1998-06-01 00:00:00.000
AFA Afghani 1998-06-01 00:00:00.000
... ... ...
... ... ...
ZWD Zimbabwe Dollar 1998-06-01 00:00:00.000
在使用密码登录时需要将
-U
后的用户名和
-P
后的密码加上双引号。
注:
bcp
除了可以在控制台执行外,还可以通过调用
SQL Server
的一个系统存储过程
xp_cmdshell
以
SQL
语句的方式运行
bcp
。如上述第一条命令可改写为
EXEC master..xp_cmdshell 'bcp AdventureWorks.sales.currency out c:/currency1.txt -c -U"sa" -P"password"'
执行
xp_cmdshell
后,返回信息以表的形式输出。为了可以方便地在
SQL
中执行
bcp
,下面的命令都使用
xp_cmdshell
执行
bcp
命令。
(2)
对要导出的表进行过滤。
bcp
不仅可以接受表名或视图名做为参数,也可以接受
SQL
做为参数。通过
SQL
语句可以对要导出的表进行过滤,然后导出过滤后的记录。
EXEC master..xp_cmdshell 'bcp "SELECT TOP 20 * FROM AdventureWorks.sales.currency" queryout c:/currency2.txt -c -U"sa" -P"password"'
bcp
还可以通过简单地设置选项对导出的行进行限制。
这条命令使用了两个参数
-F 10
和
-L 13
,表示从
SE
EXEC master..xp_cmdshell 'bcp "SELECT TOP 20 * FROM AdventureWorks.sales.currency" queryout c:/currency2.txt -F 10 -L 13 -c -U"sa" -P"password"'
LECT TOP 20 * FROM AdventureWorks.sales.currency
所查出来的结果中取第
10
条到
13
条记录进行导出。
3.
如何使用
bcp
导出格式文件
bcp
不仅可以根据表、视图导入导出数据,还可以配合格式文件对导入导出数据进行限制。格式文件以纯文本文件形式存在,分为一般格式和
xml
格式。用户可以手工编写格式文件,也可以通过
bcp
命令根据表、视图自动生成格式文件。
EXEC master..xp_cmdshell 'bcp AdventureWorks.sales.currency format nul -f c:/currency_format1.fmt -c -T'
上述命令将
currency
表的结构生成了一个格式文件
currency_format1.fmt
,下面是这个格式文件的内容。
9.0
3
1 SQLCHAR 0 6 "/t" 1 CurrencyCode SQL_Latin1_General_CP1_CI_AS
2 SQLCHAR 0 100 "/t" 2 Name SQL_Latin1_General_CP1_CI_AS
3 SQLCHAR 0 24 "/r/n" 3 ModifiedDate
这个格式文件记录了这个表的字段(共
3
个字段)类型、长度、字符和行分割符和字段名等信息。
bcp
还可以通过
-x
选项生成
xml
格式的格式文件。
EXEC master..xp_cmdshell 'bcp AdventureWorks.sales.currency format nul -f c:/currency_format2.fmt -x -c -T'
xml
格式文件所描述的内容和普通格式文件所描述的内容完全一样,只是格式不同。
4.
如何使用
bcp
导入数据
bcp
可以通过
in
命令将上面所导出的
currency1.txt
和
currency2.txt
再重新导入到数据库中,由于
currency
有主键,因此我们将复制一个和
currency
的结构完全一样的表。
SELECT TOP 0 * INTO AdventureWorks.sales.currency1 FROM AdventureWorks.sales.currency
将数据导入到
currency1
表中
EXEC master..xp_cmdshell 'bcp AdventureWorks.sales.currency1 in c:/currency1.txt -c -T'
导入数据也同样可以使用
-F
和
-L
选项来选择导入数据的记录行。
EXEC master..xp_cmdshell 'bcp AdventureWorks.sales.currency1 in c:/currency1.txt -c -F 10 -L 13 -T'
在导入数据时可以根据已经存在的格式文件将满足条件的记录导入到数据库中,不满足则不导入。如上述的格式文件中的第三个字段的字符长度是
24
,如果某个文本文件中的相应字段的长度超过
24
,则这条记录将不被导入到数据库中,其它满足条件的记录正常导入。
使用普通的格式文件
EXEC master..xp_cmdshell 'bcp AdventureWorks.sales.currency1 in c:/currency1.txt -F 10 -L 13 -c -f c:/currency_format1.fmt -T'
使用
xml
格式的格式文件
EXEC master..xp_cmdshell 'bcp AdventureWorks.sales.currency1 in c:/currency1.txt -F 10 -L 13 -c -x -f c:/currency_format2.fmt -T'
总结
bcp
命令是
SQL Server
提供的一个快捷的数据导入导出工具。使用它不需要启动任何图形管理工具就能以高效的方式导入导出数据。当然,它也可以通过
xp_cmdshell
在
SQL
语句中执行,通过这种方式可以将其放到客户端程序中(如
delphi
、
c#
等)运行,这也是使客户端程序具有数据导入导出功能的方法之一。