bcp 实用工具可以在 MicrosoftSQL 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 [-m max_errors] [-f format_file] [-x] [-e err_file] [-F first_row] [-L last_row] [-b batch_size] [-d database_name] [-n] [-c] [-N] [-w] [-V (70 | 80 | 90 )] [-q] [-C { ACP | OEM | RAW | code_page } ] [-t field_term] [-r row_term] [-i input_file] [-o output_file] [-a packet_size] [-S [server_name[/instance_name]]] [-U login_id] [-P password] [-T] [-v] [-R] [-k] [-E] [-h"hint [,...n]"]
当安装 MicrosoftSQL 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 现在会强制执行数据验证和数据检查,这样,在对数据文件中的无效数据执行脚本时,可能会导致脚本失败。例如,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 脚本失败。 |
本部分包含以下示例:
-
A. 将表行复制到数据文件中(使用可信连接)
-
B. 将表行复制到数据文件中(使用混合模式身份验证)
-
C. 将文件中的数据复制到表中
-
D. 将特定的列复制到数据文件中
-
E. 将特定的行复制到数据文件中
-
F. 将查询中的数据复制到数据文件中
-
G. 创建非 XML 格式化文件
-
H. 创建 XML 格式化文件
-
I. 使用格式化文件进行 bcp 大容量导入
A. 将表行复制到数据文件中(使用可信连接)
下面的示例阐释了 AdventureWorks2008R2.Sales.Currency 表中的 out 选项。此示例创建一个名为 Currency.dat 的数据文件,并使用字符格式将表数据复制到该文件中。该示例假定您使用 Windows 身份验证,并且与运行 bcp 命令所针对的服务器实例之间具有可信连接。
在命令提示符处输入以下命令:
B. 将表行复制到数据文件中(使用混合模式身份验证)
下面的示例阐释了 AdventureWorks.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
若要将字符数据大容量复制到新表中(即导入数据),可在命令提示符处输入以下命令:
若��验证命令是否成功,并在查询编辑器中显示表的内容,请输入:
D. 将特定的列复制到数据文件中
若要复制特定列,可以使用 queryout 选项。下面的示例仅将 Sales.Currency 表中的 Name 列复制到数据文件中。该示例假定您使用 Windows 身份验证,并且与运行 bcp 命令所针对的服务器实例之间具有可信连接。
在 Windows 命令提示符下,输入以下内容:
E. 将特定的行复制到数据文件中
若要复制特定行,可以使用 queryout 选项。下面的示例仅将名为 Jarrod Rana 的联系人行从 AdventureWorks2008R2.Person.Person 表复制到数据文件 (Jarrod Rana.dat) 中。该示例假定您使用 Windows 身份验证,并且与运行 bcp 命令所针对的服务器实例之间具有可信连接。
在 Windows 命令提示符下,输入以下内容:
F. 将查询中的数据复制到数据文件中
若要将 Transact-SQL 语句的结果集复制到数据文件中,可使用 queryout 选项。下面的示例将 AdventureWorks2008R2.Person.Person 表中的姓名复制到 Contacts.txt 数据文件中;这些姓名先按名排序,再按姓排序。该示例假定您使用 Windows 身份验证,并且与运行 bcp 命令所针对的服务器实例之间具有可信连接。
在 Windows 命令提示符下,输入以下内容:
G. 创建非 XML 格式化文件
下面的示例为 AdventureWorks2008R2 数据库中的 Sales.Currency 表创建一个非 XML 格式化文件 Currency.fmt。该示例假定您使用 Windows 身份验证,并且与运行 bcp 命令所针对的服务器实例之间具有可信连接。
在 Windows 命令提示符下,输入以下内容:
有关详细信息,请参阅了解非 XML 格式化文件。
H. 创建 XML 格式化文件
下面的示例为 AdventureWorks 数据库中的 Sales.Currency 表创建一个名为 Currency.xml 的 XML 格式化文件。该示例假定您使用 Windows 身份验证,并且与运行 bcp 命令所针对的服务器实例之间具有可信连接。
在 Windows 命令提示符下,输入以下内容:
注意 |
---|
若要使用 -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 命令提示符下,输入以下内容:
注意 |
---|
如果数据文件字段和表中的列不同(例如,在编号、排序或数据类型方面),则可使用格式化文件。有关详细信息,请参阅用来导入或导出数据的格式化文件。 |