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 data_file | out data_file | queryout data_file | format nul} [-a packet_size] [-b batch_size] [-c] [-C { ACP | OEM | RAW | code_page } ] [-d database_name] [-e err_file] [-E] [-f format_file] [-F first_row] [-h"hint [,...n]"] [-i input_file] [-k] [-K application_intent] [-L last_row] [-m max_errors] [-n] [-N] [-o output_file] [-P password] [-q] [-r row_term] [-R] [-S [server_name[\instance_name]] [-t field_term] [-T] [-U login_id] [-v] [-V (80 | 90 | 100 )] [-w] [-x] /?

-
in 从文件复制到数据库表或视图。
-
out 从数据库表或视图复制到文件。 如果指定了现有文件,则该文件将被覆盖。 提取数据时,请注意 bcp 实用工具将空字符串表示为 null,而将 null 字符串表示为空字符串。
-
queryout 从查询中复制,仅当从查询大容量复制数据时才必须指定此选项。
-
format 根据指定的选项(-n、-c、-w 或 -N)以及表或视图的分隔符创建格式化文件。 大容量复制数据时,bcp 命令可以引用一个格式化文件,从而避免以交互方式重复输入格式信息。 format 选项要求指定 -f选项;创建 XML 格式化文件时还需要指定 -x 选项。 有关详细信息,请参阅创建格式化文件 (SQL Server)。 您必须指定 nul 作为值 (format nul)。
![]() |
---|
建议在格式化文件中为每个列指定一个排序规则名称。 |
代码页值 | 说明 | ||
---|---|---|---|
ACP | ANSI/Microsoft Windows (ISO 1252)。 | ||
OEM | 客户端使用的默认代码页。 未指定 -C 时使用的默认代码页。 | ||
RAW | 不进行代码页间的转换。 因为不进行转换,所以这是最快的选项。 | ||
code_page | 特定的代码页编号,例如 850。
|
-
如果 -f 与 format 选项一起使用,则将为指定的表或视图创建指定的format_file。 若要创建 XML 格式化文件,请同时指定 -x 选项。 有关详细信息,请参阅创建格式化文件 (SQL Server)。
-
如果与 in 或 out 选项一起使用,则 -f 需要一个现有的格式化文件。
注意
与 in 或 out 选项一起使用时,格式化文件是可选的。 如果没有 -f 选项,则在未指定 -n、-c、-w 或 -N 时,该命令将提示输入格式信息,并允许您将响应保存在格式化文件(默认文件名为 Bcp.fmt)中。
![]() |
---|
始终强制使用 UNIQUE、PRIMARY KEY 和 NOT NULL 约束。 |
![]() |
---|
bcp 现在会强制执行数据验证和数据检查,这样,在对数据文件中的无效数据执行脚本时,可能会导致脚本失败。 |
![]() |
---|
-m max_errors 开关不适用于约束检查。 |
![]() |
---|
-m 选项也不适用于转换 money 或 bigint 数据类型。 |
![]() |
---|
不要使用空密码。请使用强密码。 |
![]() |
---|
如果 bcp 实用工具通过使用集成安全性的可信连接连接到 SQL Server,则使用 -T 选项(可信连接),而不要使用 user name 和 password 的组合。 |

本机数据文件支持
在 SQL Server 2012 中, 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 AdventureWorks2012.Sales.Currency out "Currency Types.dat" -T -c
-
若要指定包含空格或引号的数据库名称,必须使用 -q 选项。
-
对于包含嵌入空格或引号的所有者、表或视图的名称,可以执行以下任一操作:
-
指定 -q 选项,或者
-
将所有者、表或视图的名称括在方括号 ([]) 中,并用引号引起来。
-
数据验证
bcp 现在会强制执行数据验证和数据检查,这样,在对数据文件中的无效数据执行脚本时,可能会导致脚本失败。 例如, bcp 现在可以验证:-
float 或 real 数据类型的本机表示形式是否有效。
-
Unicode 数据的字节数是否为偶数。
大容量导出或导入 SQLXML 文档
若要大容量导出或导入 SQLXML 数据,请在格式化文件中使用下列数据类型之一。 数据类型 | 效果 |
---|---|
SQLCHAR 或 SQLVARYCHAR | 在客户端代码页或排序规则隐含的代码页中发送数据。 与在不指定格式化文件的情况下指定 -c 开关具有相同的效果。 |
SQLNCHAR 或 SQLNVARCHAR | 以 Unicode 格式发送数据。 与在不指定格式化文件的情况下指定 -w 开关具有相同的效果。 |
SQLBINARY 或 SQLVARYBIN | 不经任何转换即发送数据。 |

-
存在约束,但没有指定 CHECK_CONSTRAINTS 提示。
注意
禁用约束是默认行为。 若要显式启用约束,请使用 -h 选项和 CHECK_CONSTRAINTS 提示。
-
存在触发器,但没有指定 FIRE_TRIGGER 提示。
注意
默认情况下,不激发触发器。 若要显式激发触发器,请使用 -h 选项和 FIRE_TRIGGERS 提示。
-
可以使用 -E 选项从数据文件导入标识值。
![]() |
---|
要求对目标表具有 ALTER TABLE 权限是 SQL Server 2005 的新要求。 如果用户帐户不具有对目标表的 ALTER TABLE 权限,这项新要求有可能导致不强制使用触发器和约束检查的 bcp 脚本失败。 |

-
(管理员/用户)应尽可能使用本机格式 (-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.将表行复制到数据文件中(使用可信连接)
下面的示例阐释了 AdventureWorks2012.Sales.Currency表中的 out 选项。 此示例创建一个名为 Currency.dat的数据文件,并使用字符格式将表数据复制到该文件中。 该示例假定您使用 Windows 身份验证,并且与运行 bcp 命令所针对的服务器实例之间具有可信连接。在命令提示符处输入以下命令:bcp AdventureWorks2012.Sales.Currency out Currency.dat -T -c
B.将表行复制到数据文件中(使用混合模式身份验证)
下面的示例阐释了 AdventureWorks2012.Sales.Currency表中的 out 选项。 此示例创建一个名为 Currency.dat的数据文件,并使用字符格式将表数据复制到该文件中。该示例假定您使用混合模式身份验证,您必须使用 -U 开关指定登录 ID。 并且,除非您连接到本地计算机上 SQL Server 的默认实例,否则请使用 -S 开关指定系统名称和实例名称(可选)。bcp AdventureWorks2012.Sales.Currency out Currency.dat -c -U<login_id> -S<server_name\instance_name>
C.将文件中的数据复制到表中
下面的示例使用上一个示例中创建的文件 ( Currency.dat) 来阐释 in 选项。 但是,此示例将首先创建一个 AdventureWorks2012 Sales.Currency表的空副本 Sales.Currency2,数据将被复制到该副本中。 该示例假定您使用 Windows 身份验证,并且与运行 bcp 命令所针对的服务器实例之间具有可信连接。若要创建空表,可在查询编辑器中输入以下命令:USE AdventureWorks2012; GO SELECT * INTO AdventureWorks2012.Sales.Currency2 FROM AdventureWorks2012.Sales.Currency WHERE 1=2;
bcp AdventureWorks2012.Sales.Currency2 in Currency.dat -T -c
USE AdventureWorks2012; GO SELECT * FROM Sales.Currency2
D.将特定的列复制到数据文件中
若要复制特定列,可以使用 queryout 选项。 下面的示例仅将 Sales.Currency表中的 Name列复制到数据文件中。 该示例假定您使用 Windows 身份验证,并且与运行 bcp 命令所针对的服务器实例之间具有可信连接。在 Windows 命令提示符下,输入以下内容:bcp "SELECT Name FROM AdventureWorks.Sales.Currency" queryout Currency.Name.dat -T -c
E.将特定的行复制到数据文件中
若要复制特定行,可以使用 queryout 选项。 下面的示例仅将名为 Jarrod Rana的联系人的行从 AdventureWorks2012.Person.Person表复制到数据文件 ( Jarrod Rana.dat)中。该示例假定您使用 Windows 身份验证,并且与运行 bcp 命令所针对的服务器实例之间具有可信连接。在 Windows 命令提示符下,输入以下内容:bcp "SELECT * FROM AdventureWorks2012.Person.Person WHERE FirstName='Jarrod' AND LastName='Rana' " queryout "Jarrod Rana.dat" -T -c
F.将查询中的数据复制到数据文件中
若要将 Transact-SQL 语句的结果集复制到数据文件中,请使用 queryout 选项。 下面的示例将 AdventureWorks2012.Person.Person表中的姓名复制到 Contacts.txt数据文件中;这些姓名先按姓排序,再按名排序。 该示例假定您使用 Windows 身份验证,并且与运行 bcp 命令所针对的服务器实例之间具有可信连接。在 Windows 命令提示符下,输入以下内容:bcp "SELECT FirstName, LastName FROM AdventureWorks2012.Person.Person ORDER BY LastName, Firstname" queryout Contacts.txt -c -T
G.创建非 XML 格式化文件
下面的示例为 AdventureWorks2012 数据库中的 Sales.Currency表创建一个非 XML 格式化文件 Currency.fmt。 该示例假定您使用 Windows 身份验证,并且与运行 bcp 命令所针对的服务器实例之间具有可信连接。在 Windows 命令提示符下,输入以下内容:bcp AdventureWorks2012.Sales.Currency format nul -T -c -f Currency.fmt
H.创建 XML 格式化文件
下面的示例为 AdventureWorks2012 数据库中的 Sales.Currency表创建一个名为 Currency.xml的 XML 格式化文件。 该示例假定您使用 Windows 身份验证,并且与运行 bcp 命令所针对的服务器实例之间具有可信连接。在 Windows 命令提示符下,输入以下内容:bcp AdventureWorks2012.Sales.Currency format nul -T -c -x -f Currency.xml
![]() |
---|
若要使用 -x 开关,则必须使用 bcp 9.0 客户端。 有关如何使用 bcp 9.0 客户端的信息,请参阅“备注”。 |
I.使用格式化文件进行 bcp 大容量导入
向 SQL Server 的实例中导入数据时,若要使用以前创建的格式化文件,请同时使用 -f 开关和 in 选项。 例如,以下命令通过使用以前创建的格式化文件 ( Currency.xml),将数据文件 Currency.dat的内容大容量复制到 Sales.Currency表的副本 ( Sales.Currency2) 中。 该示例假定您使用 Windows 身份验证,并且与运行 bcp 命令所针对的服务器实例之间具有可信连接。在 Windows 命令提示符下,输入以下内容:bcp AdventureWorks2012.Sales.Currency2 in Currency.dat -T -f Currency.xml
![]() |
---|
如果数据文件字段和表中的列不同(例如,在编号、排序或数据类型方面),则可使用格式化文件。 有关详细信息,请参阅用来导入或导出数据的格式化文件 (SQL Server)。 |