SQL Server数据导入导出工具BCP详解

 
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# 等)运行,这也是使客户端程序具有数据导入导出功能的方法之一。
 
 
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页