bcp 实用工具
bcp 实用工具可以在 Microsoft SQL Server 实例和用户指定格式的数据文件间大容量复制数据。使用 bcp 实用工具可以将大量新行导入 SQL Server 表,或将表数据导入数据文件。除非与 queryout 选项一起使用,否则使用该实用工具不需要了解 Transact-SQL 知识。若要将数据导入表中,必须使用为该表创建的格式文件,或者必须了解表的结构以及对于该表中的列有效的数据类型。
有关用于 bcp 语法的语法约定,请参阅 Transact-SQL 语法约定 (Transact-SQL)。
注意 |
|---|
如果使用 bcp 备份数据,请创建一个格式化文件来记录数据格式。bcp 数据文件不包括任何架构或格式信息,因此如果已删除表或视图并且不具备格式化文件,则可能无法导入数据。 |
bcp {[[database_name.][schema].]{table_name | view_name} | "query"}
{in | out | queryout | format} data_file
[-mmax_errors] [-fformat_file] [-x] [-eerr_file]
[-Ffirst_row] [-Llast_row] [-bbatch_size]
[-ddatabase_name] [-n] [-c] [-N] [-w] [-V (70 | 80 | 90 )]
[-q] [-C { ACP | OEM | RAW | code_page } ] [-tfield_term]
[-rrow_term] [-iinput_file] [-ooutput_file] [-apacket_size]
[-S [server_name[\instance_name]]] [-Ulogin_id] [-Ppassword]
[-T] [-v] [-R] [-k] [-E] [-h"hint [,...n]"]
当安装 Microsoft SQL Server 2008 R2 工具时,将安装 bcp 10.0 客户端。如果同时安装了 SQL Server 2008 R2 和 SQL Server 2005 的工具,您所使用的可能是早期版本的 bcp 客户端,而不是 bcp 10.0 客户端,具体情况取决于 PATH 环境变量的值。此环境变量定义 Windows 用于搜索可执行文件的目录集。若要确定当前所使用的版本,请在 Windows 命令提示符下运行 bcp /v 命令。有关如何在 PATH 环境变量中设置命令路径的信息,请参阅 Windows 帮助。
只有当 SQL Server 工具和 SQL Server Native Client 一起安装后,才支持 XML 格式化文件。
有关在何处查找或如何运行 bcp 实用工具的信息以及有关命令提示实用工具语法约定的信息,请参阅命令提示实用工具。
有关准备用于大容量导入或导出操作的数据的信息,请参阅准备用于大容量导出或大容量导入的数据。
有关何时在事务日志中记录由大容量导入执行的行插入操作的信息,请参阅在大容量导入中按最小方式记录日志的前提条件。
本机数据文件支持
在 SQL Server 2008 R2 中,bcp 实用工具仅支持与 SQL Server 2000、SQL Server 2005、SQL Server 2008 和 SQL Server 2008 R2 兼容的本机数据文件。
计算列和 timestamp 列
为计算列或 timestamp 列导入的数据文件中的值将被忽略,SQL Server 将自动分配值。如果数据文件不包含表中的计算列或 timestamp 列的值,则可使用格式化文件指定应在导入数据时忽略表中的计算列或 timestamp 列;SQL Server 将自动为列分配值。
计算列和 timestamp 列会照常从 SQL Server 大容量复制到数据文件中。
指定包含空格或引号的标识符
SQL Server 标识符可以包含嵌入的空格和引号等字符。此类标识符必须按以下方式处理:
如果在命令指示符处指定的标识符或文件名包含空格或引号,则需用英文双引号 ("") 将该标识符引起来。
例如,下面的 bcp out 命令创建了一个名为 Currency Types.dat 的数据文件:
bcp AdventureWorks2008R2.Sales.Currency out "Currency Types.dat" -T -c
若要指定包含空格或引号的数据库名称,必须使用 -q 选项。
对于包含嵌入空格或引号的所有者、表或视图的名称,可以执行以下任一操作:
指定 -q 选项,或者
将所有者、表或视图的名称括在方括号 ([]) 中,并用引号引起来。
数据验证
bcp 现在会强制执行数据验证和数据检查,这样,在对数据文件中的无效数据执行脚本时,可能会导致脚本失败。例如,bcp 现在可以验证:
float 或 real 数据类型的本机表示形式是否有效。
Unicode 数据的字节数是否为偶数。
可以在早期版本的 SQL Server 中大容量导入的无效数据类型现在可能无法加载。在早期版本中,仅当客户端尝试访问无效数据时才出现失败。在大容量加载后查询数据时,添加的验证可最大限度地减少警告。
大容量导出或导入 SQLXML 文档
若要大容量导出或导入 SQLXML 数据,请在格式化文件中使用下列数据类型之一。
数据类型 | 效果 |
|---|---|
SQLCHAR 或 SQLVARYCHAR | 在客户端代码页或排序规则隐含的代码页中发送数据。与在不指定格式化文件的情况下指定 -c 开关具有相同的效果。 |
SQLNCHAR 或 SQLNVARCHAR | 以 Unicode 格式发送数据。与在不指定格式化文件的情况下指定 -w 开关具有相同的效果。 |
SQLBINARY 或 SQLVARYBIN | 不经任何转换即发送数据。 |
bcp out 操作要求对源表有 SELECT 权限。
bcp in 操作要求至少对目标表有 SELECT/INSERT 权限。此外,如果下列任一条件成立,则要求拥有 ALTER TABLE 权限:
存在约束,但没有指定 CHECK_CONSTRAINTS 提示。
注意禁用约束是默认行为。若要显式启用约束,请使用 -h 选项和 CHECK_CONSTRAINTS 提示。
存在触发器,但没有指定 FIRE_TRIGGER 提示。
注意默认情况下,不激发触发器。若要显式激发触发器,请使用 -h 选项和 FIRE_TRIGGERS 提示。
可以使用 -E 选项从数据文件导入标识值。
注意 |
|---|
要求对目标表具有 ALTER TABLE 权限是 SQL Server 2005 的新要求。如果用户帐户不具有对目标表的 ALTER TABLE 权限,这项新要求有可能导致不强制使用触发器和约束检查的 bcp 脚本失败。 |
本节提供针对字符模式 (-c) 和本机模式 (-n) 的建议。
(管理员/用户)应该尽可能使用本机格式 (-n) 以便避免分隔符问题。使用本机格式以便通过 SQL Server 进行导出和导入。如果数据将导入到非 SQL Server 数据库中,则使用 -c 或 -w 选项从 SQL Server 导出数据。
(管理员)在使用 BCP OUT 时对数据进行验证。例如,如果您使用了 BCP OUT、BCP IN,然后又使用 BCP OUT,则请验证数据正确导出,并且终止符值未用作某些数据值的一部分。请考虑使用随机的十六进制值来代替默认的终止符(使用 -t 和 -r 选项),以免在终止符值和数据值之间发生冲突。
(用户)使用长且唯一的终止符(任何字节或字符序列)将与实际字符串值发生冲突的可能性降至最低。这可以通过使用 -t 和 -r 选项实现。
本部分包含以下示例:
A. 将表行复制到数据文件中(使用可信连接)
B. 将表行复制到数据文件中(使用混合模式身份验证)
C. 将文件中的数据复制到表中
D. 将特定的列复制到数据文件中
E. 将特定的行复制到数据文件中
F. 将查询中的数据复制到数据文件中
G. 创建非 XML 格式化文件
H. 创建 XML 格式化文件
I. 使用格式化文件进行 bcp 大容量导入
A. 将表行复制到数据文件中(使用可信连接)
下面的示例阐释了 AdventureWorks2008R2.Sales.Currency 表中的 out 选项。此示例创建一个名为 Currency.dat 的数据文件,并使用字符格式将表数据复制到该文件中。该示例假定您使用 Windows 身份验证,并且与运行 bcp 命令所针对的服务器实例之间具有可信连接。
在命令提示符处输入以下命令:
bcp AdventureWorks2008R2.Sales.Currency out Currency.dat -T -c
B. 将表行复制到数据文件中(使用混合模式身份验证)
下面的示例阐释了 Sales.Currency 表中的 out 选项。此示例创建一个名为 Currency.dat 的数据文件,并使用字符格式将表数据复制到该文件中。
该示例假定您使用混合模式身份验证,您必须使用 -U 开关指定登录 ID。并且,除非您连接到本地计算机上 SQL Server 的默认实例,否则请使用 -S 开关指定系统名称和实例名称(可选)。
bcp AdventureWorks2008R2.Sales.Currency out Currency.dat -c -U<login_id> -S<server_name\instance_name>
系统将提示您输入密码。
C. 将文件中的数据复制到表中
下面的示例使用上一个示例中创建的文件 (Currency.dat) 来阐释 in 选项。但是,此示例将首先创建一个 Sales.Currency 表的空副本 Sales.Currency2,数据将被复制到该副本中。该示例假定您使用 Windows 身份验证,并且与运行 bcp 命令所针对的服务器实例之间具有可信连接。
若要创建空表,可在查询编辑器中输入以下命令:
USE AdventureWorks2008R2; GO SELECT * INTO AdventureWorks2008R2.Sales.Currency2 FROM AdventureWorks2008R2.Sales.Currency WHERE 1=2
若要将字符数据大容量复制到新表中(即导入数据),可在命令提示符处输入以下命令:
bcp AdventureWorks2008R2.Sales.Currency2 in Currency.dat -T -c
若要验证命令是否成功,并在查询编辑器中显示表的内容,请输入:
USE AdventureWorks2008R2; GO SELECT * FROM Sales.Currency2;
D. 将特定的列复制到数据文件中
若要复制特定列,可以使用 queryout 选项。下面的示例仅将 Sales.Currency 表中的 Name 列复制到数据文件中。该示例假定您使用 Windows 身份验证,并且与运行 bcp 命令所针对的服务器实例之间具有可信连接。
在 Windows 命令提示符下,输入以下内容:
bcp "SELECT Name FROM AdventureWorks2008R2.Sales.Currency" queryout Currency.Name.dat -T -c
E. 将特定的行复制到数据文件中
若要复制特定行,可以使用 queryout 选项。下面的示例仅将名为 Jarrod Rana 的联系人行从 Person.Person 表复制到数据文件 (Jarrod Rana.dat) 中。该示例假定您使用 Windows 身份验证,并且与运行 bcp 命令所针对的服务器实例之间具有可信连接。
在 Windows 命令提示符下,输入以下内容:
bcp "SELECT * FROM AdventureWorks2008R2.Person.Person WHERE FirstName='Jarrod' AND LastName='Rana' " queryout "Jarrod Rana.dat" -T -c
F. 将查询中的数据复制到数据文件中
若要将 Transact-SQL 语句的结果集复制到数据文件中,可使用 queryout 选项。下面的示例将 AdventureWorks2008R2.Person.Person 表中的姓名复制到 Contacts.txt 数据文件中;这些姓名先按名排序,再按姓排序。该示例假定您使用 Windows 身份验证,并且与运行 bcp 命令所针对的服务器实例之间具有可信连接。
在 Windows 命令提示符下,输入以下内容:
bcp "SELECT FirstName, LastName FROM AdventureWorks2008R2.Person.Person ORDER BY LastName, Firstname" queryout Contacts.txt -c -T
G. 创建非 XML 格式化文件
下面的示例为 AdventureWorks2008R2 数据库中的 Sales.Currency 表创建一个非 XML 格式化文件 Currency.fmt。该示例假定您使用 Windows 身份验证,并且与运行 bcp 命令所针对的服务器实例之间具有可信连接。
在 Windows 命令提示符下,输入以下内容:
bcp AdventureWorks2008R2.Sales.Currency format nul -T -c -f Currency.fmt
有关详细信息,请参阅了解非 XML 格式化文件。
H. 创建 XML 格式化文件
下面的示例为 AdventureWorks2008R2 数据库中的 Sales.Currency 表创建一个名为 Currency.xml 的 XML 格式化文件。该示例假定您使用 Windows 身份验证,并且与运行 bcp 命令所针对的服务器实例之间具有可信连接。
在 Windows 命令提示符下,输入以下内容:
bcp AdventureWorks2008R2.Sales.Currency format nul -T -c -x -f Currency.xml
注意 |
|---|
若要使用 -x 开关,则必须使用 bcp 9.0 客户端。有关如何使用 bcp 9.0 客户端的信息,请参阅“备注”。 |
有关详细信息,请参阅了解 XML 格式化文件。
I. 使用格式化文件进行 bcp 大容量导入
向 SQL Server 的实例中导入数据时,若要使用以前创建的格式化文件,请同时使用 -f 开关和 in 选项。例如,以下命令通过使用以前创建的格式化文件 (Currency.xml),将数据文件 Currency.dat 的内容大容量复制到 Sales.Currency 表的副本 (Sales.Currency2) 中。该示例假定您使用 Windows 身份验证,并且与运行 bcp 命令所针对的服务器实例之间具有可信连接。
在 Windows 命令提示符下,输入以下内容:
bcp AdventureWorks2008R2.Sales.Currency2 in Currency.dat -T -f Currency.xml
注意 |
|---|
如果数据文件字段和表中的列不同(例如,在编号、排序或数据类型方面),则可使用格式化文件。有关详细信息,请参阅用来导入或导出数据的格式化文件。 |