bcp 实用工具
适用于:SQL Server
Azure SQL 数据库
Azure SQL 托管实例
Azure Synapse Analytics
Analytics Platform System (PDW)
Microsoft Fabric SQL 数据库
大容量复制程序实用工具 (bcp) 在 Microsoft SQL Server 实例和用户指定格式的数据文件间大容量复制数据。
若要在 Linux 上使用 bcp,请参阅在 Linux 上安装 SQL Server 命令行工具 sqlcmd 和 bcp。 有关将 bcp 与 Azure Synapse Analytics 配合使用的详细信息,请参阅使用 bcp 加载数据。
使用 bcp 实用工具可以将大量新行导入 SQL Server 表,或将表数据导出到数据文件。 除非与 queryout
选项一起使用,否则使用该实用工具不需要了解 Transact-SQL 知识。 若要将数据导入表中,必须使用为该表创建的格式化文件,或者了解表的结构及其列有效的数据类型。
注意
如果使用 bcp 备份数据,请创建一个格式化文件来记录数据格式。 bcp 数据文件不包括任何架构或格式信息,因此如果已删除表或视图并且不具备格式化文件,则可能无法导入数据。
有关用于 bcp 语法的语法约定,请参阅 Transact-SQL 语法约定。
对于 Linux 和 macOS 上的 bcp,请参阅 linux 和 macOS 上的 bcp 注意事项。
下载最新版本的 bcp 实用工具
命令行工具为公开发行版 (GA),但与 SQL Server 2019 (15.x) 及更高版本的安装程序包一起发布。
版本信息
- 版本号:15.0.4298.1
- 生成号:15.0.4298.1
- 发布日期:2023 年 4 月 7 日
bcp 支持 Microsoft Entra 身份验证,包括对 Azure SQL 数据库、Microsoft Fabric 中的 SQL 数据库以及 Azure Synapse Analytics 的多重身份验证(MFA)支持。
注意
Microsoft Entra ID 以前称为 Azure Active Directory (Azure AD)。
系统要求
- Windows 8、Windows 8.1、Windows 10、Windows 11
- Windows Server 2016、Windows Server 2019、Windows Server 2022
此组件要求安装最新的 Microsoft ODBC Driver 17 for SQL Server。
若要查看 bcp 版本,请执行 命令,并确认使用的是 15.0.4298.1 或更高版本。
语法
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]
[-D]
[-e err_file]
[-E]
[-f format_file]
[-F first_row]
[-G Microsoft Entra authentication]
[-h"hint [,...n]"]
[-i input_file]
[-k]
[-K application_intent]
[-l login_timeout]
[-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]
[-u]
[-v]
[-V (80 | 90 | 100 | 110 | 120 | 130 | 140 | 150 | 160)]
[-w]
[-x]
[-Y[s|m|o]]
注意事项和限制
- bcp 实用工具有一个限制,即错误消息仅显示 512 字节字符。 仅显示错误消息的前 512 个字节。
Linux 和 macOS 上的 bcp 注意事项
字段终止符是制表符 (
\t
)。行终止符是换行符 (
\n
)。字符模式是 bcp 格式化文件和不包含扩展字符的数据文件的优选格式。
命令行参数中的反斜杠 (
\
) 必须加引号或进行转义。 例如,若要将某个换行符指定为自定义行终止符,必须使用以下某一机制:-r\\n
-r"\n"
-r'\n'
命令行选项
下表列出了 bcp中提供的命令行选项,以及它们支持的操作系统。
命令行选项 | 在 Windows 上受支持 | Linux 和 macOS 上受支持 |
---|---|---|
[database_name.]schema.{table_name | view_name | "query"} | 是的 | 是的 |
[{indata_file | outdata_file | queryoutdata_file | format nul}]() | 是的 | 是的 |
-a 数据包大小 | 是的 | 是的 |
-b batch_size | 是的 | 是的 |
-c | 是的 | 是的 |
-C { ACP | OEM | RAW | code_page } | 是的 | 不 |
-d database_name | 是的 | 是的 |
-D | 是的 | 是的 |
-e err_file | 是的 | 是的 |
-E | 是的 | 是的 |
-f format_file | 是的 | 是的 |
-F 第一行 | 是的 | 是的 |
-G Microsoft Entra 身份验证 | 是的 | 是的 |
-h"hint [,...n]" | 是的 | 不 |
-i input_file | 是的 | 不 |
-k | 是的 | 是的 |
-K 应用意图 | 是的 | 是的 |
-l login_timeout | 是的 | 是的 |
-L 最后一排 | 是的 | 是的 |
-m max_errors | 是的 | 是的 |
-n | 是的 | 是的 |
-N | 是的 | 不 |
-o output_file | 是的 | 不 |
-P 密码 | 是的 | 是的 |
-q | 是的 | 是的 |
-r row_term | 是的 | 是的 |
-R | 是的 | 是的 |
-S [server_name[\instance_name]] | 是的 | 是的 |
-t field_term | 是的 | 是的 |
-T | 是的 | 是的 |
-U login_id | 是的 | 是的 |
-u | 不 | 是的 |
-v | 是的 | 是的 |
-V (80 | 90 | 100 | 110 | 120 | 130 | 140 | 150 | 160 ) | 是的 | 不 |
-w | 是的 | 是的 |
-x | 是的 | 不 |
-Y[s|m|o] | 不 | 是的 |
数据库名称
指定的表或视图所在数据库的名称。 如果未指定,则使用用户的默认数据库。
也可以使用 -d
显式指定数据库名称。
schema
表或视图的所有者的名称。 如果执行该操作的用户拥有指定的表或视图,则 schema 是可选的。 如果未指定 架构,并且执行该操作的用户不拥有指定的表或视图,则 SQL Server 将返回错误消息,并取消该操作。
table_name
将数据导入 SQL Server (in
) 时为目标表名称,将数据从 SQL Server 导出时 (out
) 为源表名称。
view_name
将数据复制到 SQL Server (in
) 时为目标视图名称,从 SQL Server 中复制数据时 (out
) 为源视图名称。 只有其中所有列都引用同一个表的视图才能用作目标视图。 有关将数据复制到视图的限制的详细信息,请参阅 INSERT。
"query"
一个返回结果集的 Transact-SQL 查询。 如果该查询返回多个结果集,则只将第一个结果集复制到数据文件,而忽略其余的结果集。 将查询用双引号括起来,将查询中嵌入的任何内容用单引号括起来。 queryout
从查询大容量复制数据时,也必须指定 。
只要在执行 bcp 语句之前存储过程内引用的所有表均存在,查询就可以引用该存储过程。 例如,如果存储过程生成一个临时表,则 bcp 语句便会失败,因为该临时表只在运行时可用,而在语句执行时不可用。 在这种情况下,应考虑将存储过程的结果插入表中,然后使用 bcp 将数据从表复制到数据文件中。
in
从文件复制到数据库表或视图。 指定大容量复制的方向。
out
从数据库表或视图复制到文件。 指定大容量复制的方向。
如果指定了现有文件,则该文件将被覆盖。 当 bcp 实用工具提取数据时,它将空字符串表示为 null,将 null 字符串表示为空字符串。
data_file
数据文件的完整路径。 将数据批量导入 SQL Server时,数据文件将包含要复制到指定的表或视图中的数据。 从 SQL Server中批量导出数据时,数据文件将包含从表或视图中复制的数据。 路径可以有 1 到 255 个字符。 数据文件最多可包含 2^63 - 1 行。
queryout
从查询中复制,仅当从查询大容量复制数据时才必须指定此选项。
format
根据指定的选项(-n
、-c
、-w
或 -N
)以及表或视图分隔符创建格式化文件。 大容量复制数据时,bcp 命令可以引用一个格式化文件,从而避免以交互方式重复输入格式信息。 format
选项要求指定 -f
选项;创建 XML 格式化文件时还需要指定 -x
选项。 有关详细信息,请参阅创建格式化文件 (SQL Server)。 必须指定 nul
作为值 (format nul
)。
-a packet_size
指定服务器发出或接收的每个网络数据包的字节数。 可以使用 SQL Server Management Studio (或 sp_configure
系统存储过程)来设置服务器配置选项。 但是,可以使用此选项逐个替代服务器配置选项。 packet_size 的取值范围为 4,096 到 65,535 字节,默认值为 4096
。
增大数据包可以提高大容量复制操作的性能。 如果无法得到请求的较大数据包,则使用默认值。 bcp 实用工具生成的性能统计信息可以显示所用的数据包大小。
-b batch_size
指定每批导入数据的行数。 每个批次均作为一个单独的事务进行导入并记录,在提交之前会导入整批。 默认情况下,数据文件中的所有行均作为一个批次导入。 若要将行分为多个批次进行操作,请指定小于数据文件中的行数的 batch_size 。 如果任何批次的事务失败,则将只回滚当前批次中的插入。 已经由已提交事务导入的批次不会受到将来失败的影响。
不要将此选项与 -h "ROWS_PER_BATCH=<bb>"
选项一起使用。
-c
使用字符数据类型执行该操作。 此选项不提示输入每个字段;它使用 char 作为存储类型,没有前缀;使用 (制表符)作为字段分隔符,使用 \t
(换行符)作为行终止符。 -c
与 -w
不兼容。
有关详细信息,请参阅使用字符格式导入或导出数据 (SQL Server)。
-C { ACP | OEM | RAW | code_page }
适用范围:仅限 Windows。 Linux 和 macOS 不支持。
指定该数据文件中数据的代码页。 仅当数据含有字符值大于 127 或小于 32 的code_page 、 code_page, varcode_page列时, code_page columns with code_pageacter values greater than 127 or less than 32.
应为格式化文件中的每个列指定排序规则名称,除非希望 65001 选项优先于排序规则/代码页规范。
代码页值 | 说明 |
---|---|
ACP |
ANSI/Microsoft Windows (ISO 1252)。 |
OEM |
客户端使用的默认代码页。 这是未指定 -C 时使用的默认代码页。 |
RAW |
不进行代码页间的转换。 因为不进行转换,所以这是最快的选项。 |
<code_page> |
特定的代码页编号,例如 850。 低于 13 (SQL Server 2016 (13.x)) 的版本不支持代码页 65001(UTF-8 编码)。 版本 13 和后续版本可将 UTF-8 编码导入以前版本的 SQL Server。 |
-d database_name
指定要连接到的数据库。 默认情况下,bcp 连接到用户的默认数据库。 如果指定了 -d <database_name>
和包含三部分的名称(database_name.schema.table,作为第一个参数传递给 bcp),则将发生错误,因为数据库名称不能指定两次。 如果 database_name 以连字符 () 或正斜杠 (-
) 开头,则不要在 /
与数据库名称之间添加空格。
-d
使值传递给将解释为数据源名称 (DSN) 的 bcp -S
选项。
DSN 可用于:
- 嵌入驱动程序选项以简化命令行,
- 强制使用命令行中无法直接访问的驱动程序选项,例如 MultiSubnetFailover,
- 或帮助保护敏感凭据,防止作为命令行参数被发现。
有关详细信息,请参阅使用 sqlcmd 进行连接中的“sqlcmd 和 bcp 中的 DSN 支持”。
-e err_file
指定错误文件的完整路径,此文件用于存储 bcp 实用工具无法从文件传输到数据库的所有行。 bcp 命令产生的错误消息将被发送到用户的工作站。 如果未使用此选项,则不会创建错误文件。
如果 err_file 以连字符 () 或正斜杠 (-
) 开头,则不要在 /
与 err_file 值之间包含空格。
-E
指定导入数据文件中的标识值用于标识列。 如果未指定 -E
,则将忽略要导入的数据文件中此列的标识值,而且 SQL Server 将根据创建表期间指定的种子值和增量值自动分配唯一值。 有关详细信息,请参阅 DBCC CHECKIDENT。
如果数据文件不包含表或视图中标识列的值,请使用格式化文件指定导入数据时应跳过表或视图中的标识列。 SQL Server 自动为列分配唯一值。
-E
选项有一个特殊的权限要求。 有关详细信息,请参阅本文后面的“备注”。
-f format_file
指定格式化文件的完整路径。 此选项的含义取决于使用它的环境,具体如下:
如果
-f
与format
选项一起使用,则将为指定的表或视图创建指定的 format_file 。 若要创建 XML 格式化文件,请同时指定-x
选项。 有关详细信息,请参阅创建格式化文件 (SQL Server)。如果与
in
或out
选项一起使用,则-f
需要一个现有的格式化文件。注意
可以选择将格式化文件与
in
或out
选项一起使用。 如果没有-f
选项,则在未指定-n
、-c
、-w
或-N
时,该命令将提示输入格式信息,并允许你将响应保存在格式化文件(默认文件名为bcp.fmt
)中。
如果 format_file 以连字符 () 或正斜杠 (-
) 开头,则不要在 /
与 format_file 值之间包含空格。
-F first_row
指定要从表中导出或从数据文件导入的第一行的编号。 此参数的值应大于 (>
) 0,但小于 (<
) 或等于 (=
) 总行数。 如果未指定此参数,则默认为文件的第一行。
first_row 可以是一个最大为 2^63-1 的正整数值。 -F
first_row 的值从 1 开始。
-G
适用于:仅 Azure SQL 数据库、Microsoft Fabric SQL 数据库 和 Azure Synapse Analytics。
客户端使用此开关来指定用户使用 Microsoft Entra ID 进行身份验证。 -G
开关需要版本 14.0.3008.27 或更高版本。 若要确定你的版本,请执行 bcp -v
。 有关详细信息,请参阅将 Microsoft Entra 身份验证用于 SQL 数据库或 Azure Synapse Analytics 或用于 Fabric SQL 数据库的身份验证。
重要
在 Linux 和 macOS 上,当前不支持 Microsoft Entra 交互式身份验证。 Microsoft Entra 集成身份验证需要 Microsoft ODBC Driver 17 for SQL Server 版本 17.6.1 及更高版本,以及正确配置的 Kerberos 环境。
要检查 bcp 版本是否包括对 Microsoft Entra 身份验证 的支持,请键入 bcp --help
并验证可用参数列表中是否显示 -G
。
Microsoft Entra 用户名和密码
如果要使用 Microsoft Entra 用户名和密码,可提供
-G
选项,也可通过提供-U
选项和-P
选项来使用用户名和密码。以下示例使用 Microsoft Entra 用户名和密码凭据导出数据。 该示例从 Azure 服务器
bcptest
的数据库testdb
导出表aadserver.database.windows.net
,并将数据存储在文件c:\last\data1.dat
中:bcp bcptest out "c:\last\data1.dat" -c -S aadserver.database.windows.net -d testdb -G -U alice@aadtest.onmicrosoft.com -P xxxxx
以下示例使用 Microsoft Entra 用户凭据导入数据。 该示例使用 Microsoft Entra 用户名和密码将数据从文件
c:\last\data1.dat
导入到 Azure 服务器bcptest
上的数据库testdb
的表aadserver.database.windows.net
中:bcp bcptest in "c:\last\data1.dat" -c -S aadserver.database.windows.net -d testdb -G -U alice@aadtest.onmicrosoft.com -P xxxxx
Microsoft Entra 集成
要进行 Microsoft Entra 集成身份验证,请提供
-G
选项而无需用户名或密码。 此配置要求当前 Windows 用户帐户(运行 bcp 命令的帐户)与 Microsoft Entra ID 联合:以下示例使用 Microsoft Entra 集成身份验证导出数据。 该示例使用与 Microsoft Entra ID 联合的 Windows 凭据将表
bcptest
从逻辑服务器testdb
上的数据库aadserver.database.windows.net
导出,并将数据存储在文件c:\last\data2.dat
中:bcp bcptest out "c:\last\data2.dat" -S aadserver.database.windows.net -d testdb -G -c
以下示例使用 Microsoft Entra 集成身份验证导入数据。 该示例与使用 Microsoft Entra ID 联合的 Windows 凭据将数据从文件表
c:\last\data2.dat
导入到逻辑服务器bcptest
上数据库testdb
的表aadserver.database.windows.net
中:bcp bcptest in "c:\last\data2.dat" -S aadserver.database.windows.net -d testdb -G -c
Microsoft Entra 托管服务标识
重要
bcp 与驱动程序紧密耦合。 创建 DSN 所使用的 bcp 和驱动程序的主要版本必须相同。 若要确定你的版本,请执行
bcp -v
。在 Windows 上使用托管服务标识通过 bcp 导出数据需要配置 DSN。
若要在运行 Windows 的计算机上配置 DSN,请执行下列操作:
按键盘上的 Windows 键
键入
ODBC
并选择 ODBC 数据源管理器的相应版本选择“用户 DSN”或“系统 DSN”选项卡
选择“添加”,然后按提示进行操作
当系统要求提供身份验证类型时,请选择“Azure 托管服务标识身份验证”
如果有用户分配的托管标识,请将该标识的
Object (principal) ID
粘贴到“身份验证”选项卡底部的“登录 ID”框中若要配置 DSN,请继续按照提示操作。
有关包括屏幕截图的完整演练,请参阅在 UI 中创建和编辑 DSN。
配置 DSN 后,可以使用 标志调用
-D
,以指示为-S
传递的值是 DSN。bcp bcptest out "c:\last\data1.dat" -c -D -S myDSN -d testdb
Microsoft Entra ID 访问令牌
适用范围:仅限 Linux 和 macOS。 不支持 Windows。
Linux 和 macOS 上的 bcp 17.8 及更高版本的用户也可以使用令牌进行身份验证。 以下示例使用 Linux 上的 PowerShell 检索访问令牌。
此示例会检索一个访问令牌并将其放入文件中,以便使用系统分配的托管标识导出数据。
Connect-AzAccount -Identity $access_token | cut -f 1 | tr -d '\n' | iconv -f ascii -t UTF-16LE > /tmp/tokenFile bcp bcptest out data2.dat -S aadserver.database.windows.net -d testdb -G -P /tmp/tokenFile -c
此示例将
Client ID
传递给-AccountId
的Connect-AzAccount
参数,以检索访问令牌并将其放入令牌文件中。 然后,该令牌用于使用指定的用户分配的托管标识导出数据。Connect-AzAccount -Identity -AccountId 'client_id_of_user_assigned_managed_identity' $access_token | cut -f 1 | tr -d '\n' | iconv -f ascii -t UTF-16LE > /tmp/tokenFile bcp bcptest out data2.dat -S aadserver.database.windows.net -d testdb -G -P /tmp/tokenFile -c
Microsoft Entra 交互式
适用范围:仅限 Windows。 不支持 Linux 和 macOS。
Microsoft Entra 交互式身份验证适用于所有 Azure SQL 和 SQL Server 2022(16.x)及更高版本,允许您使用交互式对话框进行身份验证,这种对话方式还支持多重身份验证。
Microsoft Entra 交互式身份验证需要 bcp版本 15.0.1000.34()或更高版本,以及 ODBC 版本 17.2 或更高版本()。
若要启用交互式身份验证,请仅为
-G
选项提供用户名 (-U
),而不提供密码。以下示例使用 Microsoft Entra 交互式身份验证导出数据,包括指定 Microsoft Entra 帐户的用户名。
交互模式需要手动输入密码,或者对于启用了多重身份验证的帐户,请完成配置的 MFA 身份验证方法。
bcp bcptest out "c:\last\data1.dat" -c -S aadserver.database.windows.net -d testdb -G -U alice@aadtest.onmicrosoft.com
如果使用的 Microsoft Entra 用户是联盟域中的 Windows 帐户,则在命令行中输入的用户名必须包含其域(例如
joe@contoso.com
):bcp bcptest out "c:\last\data1.dat" -c -S aadserver.database.windows.net -d testdb -G -U joe@contoso.com
如果来宾用户存在于特定的Microsoft Entra 租户中,并且属于 Azure SQL 数据库中具有执行 bcp 命令的数据库权限的组的一部分,则使用其来宾用户别名(例如,
keith0@adventure-works.com
)。
-h "hints [, ... n]"
适用范围:仅限 Windows。 Linux 和 macOS 不支持。
指定向表或视图中大容量导入数据时要用到的提示。
ORDER (column [ASC | DESC] [, ...n])
数据文件中的数据排序次序。 如果根据表中的聚集索引(如果有)对要导入的数据排序,则可提高批量导入的性能。 如果数据文件按不同的顺序排序,即与聚集索引键的顺序不同,或者表中没有聚集索引,则忽略
ORDER
子句。 提供的列名必须是目标表中有效的列名。 默认情况下, bcp 假定数据文件没有排序。 对于经过优化的批量导入, SQL Server 还将验证导入的数据是否已排序。ROWS_PER_BATCH = bb
每批数据的行数(即 bb)。 在未指定
-b
时使用,这将导致整个数据文件作为单个事务发送到服务器。 服务器根据 bb值优化大容量加载。 默认情况下,ROWS_PER_BATCH
未知。KILOBYTES_PER_BATCH = cc
每批的以千字节计数的近似数据量(即 cc)。 默认情况下,
KILOBYTES_PER_BATCH
未知。TABLOCK
指定在大容量加载操作期间获取大容量更新表级别的锁;否则,获取行级别的锁。 由于在大容量复制操作期间拥有锁可以减少表中的锁争夺,因此此提示可显著提高性能。 如果表没有索引且指定了
TABLOCK
,则可以从多个客户端并发加载表。 默认情况下,锁定行为由表选项table lock on bulkload
确定。 有关详细信息,请参阅 sp_tableoption。注意
如果目标表是聚集列存储索引,则不需要使用
TABLOCK
提示进行加载,因为每个并发线程在索引中各自分配一个独立的行组,将数据加载到该行组中。 有关详细信息,请参阅列存储索引:概述。CHECK_CONSTRAINTS
指定在批量导入操作期间,必须检查所有对目标表或视图的约束。 如果没有
CHECK_CONSTRAINTS
提示,将忽略任何CHECK
和FOREIGN KEY
约束,并在操作后将表上的约束标记为不受信任。注意
始终强制实施
UNIQUE
、PRIMARY KEY
和NOT NULL
约束。在某些时候,需要检查整个表的约束。 如果在批量导入操作之前表没有空,则重新验证约束的成本可能会超过对增量数据应用
CHECK
约束的成本。 因此,建议您在正常情况下,在进行增量式批量导入时启用约束检查。当输入数据包含违反约束的行时,您可能希望禁用约束(默认行为)。 禁用
CHECK
约束后,可以导入数据,然后使用 Transact-SQL 语句删除无效的数据。bcp 现在会强制执行数据验证和数据检查,这样,在对数据文件中的无效数据执行脚本时,可能会导致脚本失败。
注意
-m
max_errors 开关不适用于约束检查。FIRE_TRIGGERS
使用 in 参数指定此选项时,在批量复制操作期间,将执行在目标表上定义的任何插入触发器。 如果未指定
FIRE_TRIGGERS
,则不会运行任何插入触发器。 对于out
、queryout
和format
参数,将忽略FIRE_TRIGGERS
。
-i input_file
适用范围:仅限 Windows。 Linux 和 macOS 不支持。
指定响应文件的名称,其中包含在交互模式(未指定 -n
、-c
、-w
或 -N
)下执行大容量复制时,对该命令要求输入每个数据字段的提示信息所做出的响应。
如果 input_file 以连字符 () 或正斜杠 (-
) 开头,则不要在 /
与 input_file 值之间包含空格。
-k
指定在操作过程中空列应该保留 null 值,而不是所插入列的任何默认值。 有关详细信息,请参阅在批量导入期间保留 Null 或使用默认值 (SQL Server)。
-K 应用意图
连接到服务器时声明应用程序工作负荷类型。 唯一可能的值是 ReadOnly
。 如果未指定 -K
,则 bcp 实用工具将不支持连接到 Always On 可用性组中的辅助副本。 有关详细信息,请参阅卸载对 AlwaysOn 可用性组的次要副本的只读工作负荷。
-l login_timeout
指定登录超时。 -l
选项指定在尝试连接到服务器时登录 SQL Server 的超时时间(以秒为单位)。 默认登录超时值为 15 秒。 登录超时必须是介于 0 和 65534 之间的数字。 如果提供的值不是数值或不在此范围内,则 bcp 将生成错误消息。 值 0 指定无限超时。
-L last_row
指定要从表中导出或从数据文件中导入的最后一行的编号。 此参数的值应大于 (>
) 0,小于 (<
) 或等于 (=
) 最后一行的编号。 如果未指定此参数,则默认为文件的最后一行。
last_row 可以是一个最大为 2^63-1 的正整数值。
-m max_errors
指定取消 bcp 操作之前可能出现的语法错误的最大数目。 语法错误是指将数据转换为目标数据类型时的错误。 max_errors 总数不包括只能在服务器中检测到的错误,如约束冲突。
无法由 bcp 实用工具复制的行将被忽略,并计为一个错误。 如果未包括此选项,则默认值为 10。
注意
-m
选项也不适用于转换 money 或 bigint 数据类型。
-n
使用数据的本机(数据库)数据类型执行大容量复制操作。 此选项不提示输入每个字段,它将使用本机值。
有关详细信息,请参阅使用本机格式导入或导出数据 (SQL Server)。
-N
适用范围:仅限 Windows。 Linux 和 macOS 不支持。
执行大容量复制操作时,对非字符数据使用本机(数据库)数据类型的数据,对字符数据使用 Unicode 字符。 此选项是 -w
选项的一个替代选项,并具有更高的性能。此选项主要用于通过数据文件将数据从一个 SQL Server 实例传送到另一个实例。 此选项不提示输入每个字段。 如果要传送包含 ANSI 扩展字符的数据,并希望利用本机模式的性能优势,则可使用此选项。
有关详细信息信息,请参阅使用 Unicode 本机格式导入或导出数据 (SQL Server)。
如果通过将 bcp 与 -N
一起使用来导出数据后又将数据导入到同一表架构中,则在存在固定长度的非 Unicode 字符列(例如 char(10))的情况下,系统可能会显示截断警告。
可忽略该警告。 解决此警告的一个方法是使用 -n
来替代 -N
。
-o output_file
适用范围:仅限 Windows。 Linux 和 macOS 不支持。
指定文件名称,该文件用于接收从命令提示符重定向来的输出。
如果 output_file 以连字符 () 或正斜杠 (-
) 开头,则不要在 /
与 output_file 值之间包含空格。
-P password
指定登录 ID 的密码。 如果未使用此选项,bcp 命令将提示输入密码。 如果在命令提示符末尾使用此选项而不使用密码,bcp 使用默认密码(NULL
)。
重要
不要使用空密码。 请使用强密码。
若要屏蔽密码,请不要同时指定 -P
和 -U
选项。 相反,在指定 bcp 以及 -U
选项和其他开关(不要指定 -P
)后,按 Enter 键,系统会提示您输入密码。 这种方法可以确保输入密码时对其屏蔽。
如果 password 以连字符 () 或正斜杠 (-
) 开头,则不要在 /
与 password 值之间添加空格。
-q
在 bcp 实用工具与 SQL Server 实例之间的连接中执行 SET QUOTED_IDENTIFIER ON
语句。 使用此选项可以指定包含空格或单引号的数据库、所有者、表或视图的名称。 将整个三部分表或视图名称括在引号中(""
)。
若要指定包含空格或单引号的数据库名称,必须使用 -q
选项。
-q
不适用于传递到 -d
的值。
有关详细信息,请参阅本文中的 备注 部分。
-r row_term
指定行终止符。 默认值为 \n
(换行符)。 使用此参数可替代默认行终止符。 有关详细信息,请参阅指定字段终止符和行终止符 (SQL Server)。
如果在 bcp 命令中以十六进制表示法指定行终止符,则该值将在 处截断。 例如,如果指定 0x410041
,则使用 0x41
。
如果 row_term 以连字符 () 或正斜杠 (-
) 开头,则不要在 /
与 row_term 值之间包含空格。
-R
指定使用客户端计算机区域设置中定义的区域格式,将货币、日期和时间数据大容量复制到 SQL Server 中。 默认情况下,将忽略区域设置。
-S [server_name[\instance_name]]
指定要连接的 SQL Server 实例的名称,或者如果使用 -D
,则指定 DSN。
如果未指定服务器,则 bcp 实用工具将连接到本地计算机上的默认 SQL Server 实例。 如果从网络或本地命名实例上的远程计算机中运行 bcp 命令,则必须使用此选项。 若要连接到服务器上的 SQL Server 默认实例,请仅指定 server_name。 要连接到 SQL Server 的命名实例,请指定 server_nameinstance_name。
-t field_term
指定字段终止符。 默认为 \t
(制表符)。 使用此参数可以替代默认字段终止符。 有关详细信息,请参阅指定字段终止符和行终止符 (SQL Server)。
如果在 bcp 命令中以十六进制表示法指定字段终止符,则该值将在 处截断。 例如,如果指定 0x410041
,则使用 0x41
。
如果 field_term 以连字符 () 或正斜杠 (-
) 开头,则不要在 /
与 field_term 值之间包含空格。
-T
指定 bcp 实用工具通过使用集成安全性的受信任连接连接到 SQL Server 。 不需要网络用户的安全凭据 login_id 和 password。 如果未指定 -T
,则需要指定 -U
和 -P
才能成功连接。
重要
如果 bcp 实用工具通过使用集成安全性的可信连接连接到 SQL Server,则使用的是 -T
选项(可信连接),而不是用户名和密码的组合。 当 bcp 实用工具连接到 SQL 数据库或 Azure Synapse Analytics 时,不支持使用 Windows 身份验证或 Microsoft Entra 身份验证。 使用 -U
和 -P
选项。
-U login_id
指定用于连接到 SQL Server的登录 ID。
-u
适用范围:仅限 Linux 和 macOS,适用于 bcp 版本 18 及更高版本。 在 Windows 上不受支持。
信任服务器证书。
-v
报告 bcp 实用工具的版本号和版权信息。
-V { 80 | 90 | 100 | 110 | 120 | 130 | 140 | 150 | 160 }
适用范围:仅限 Windows。 Linux 和 macOS 不支持。
使用 SQL Server早期版本中的数据类型执行大容量复制操作。 此选项并不提示输入每个字段,它使用默认值。
80
= SQL Server 2000 (8.x)90
= SQL Server 2005 (9.x)100
= SQL Server 2008 (10.0.x) 和 SQL Server 2008 R2 (10.50.x)110
= SQL Server 2012 (11.x)120
= SQL Server 2014 (12.x)130
= SQL Server 2016 (13.x)140
= SQL Server 2017 (14.x)150
= SQL Server 2019 (15.x)160
= SQL Server 2022 (16.x)
例如,若要为 SQL Server 2000 (8.x)不支持、但是在较高版本的 SQL Server中引入的类型生成数据,请使用 -V80
选项。
有关详细信息,请参阅导入来自早期版本的 SQL Server 的本机格式数据和字符格式数据。
-w
使用 Unicode 字符执行大容量复制操作。 此选项不会提示输入每个字段;它使用 nchar 作为存储类型,无前缀,\t
(制表符)作为字段分隔符,\n
(换行符)作为行终止符。 -w
与 -c
不兼容。
有关详细信息,请参阅使用 Unicode 字符格式导入或导出数据 (SQL Server)。
-X
适用范围:仅限 Windows。 Linux 和 macOS 不支持。
此选项与 format
和 -f
format_file 选项结合使用,可生成基于 XML 的格式化文件,而不是默认的非 XML 格式化文件。 在导入或导出数据时,-x
不起作用。 如果不与 format
和 -f
format_file 一起使用,则将生成错误。
-Y[s|m|o]
适用范围:仅限 Linux 和 macOS,适用于 bcp 版本 18 及更高版本。 在 Windows 上不受支持。
指定连接加密模式。 选项为“严格”、“强制”和“可选”。 在没有任何参数的情况下使用 -Y
使用强制加密模式,并且等效于 -Ym
。
注解
安装 Microsoft SQL Server 2019 (15.x) 工具时,将安装 bcp 13.0 客户端。 如果为 SQL Server 的多个版本安装了工具,则根据
PATH
环境变量的值顺序,你可能使用的是早期的 bcp 客户端,而不是 bcp 13.0 客户端。 此环境变量定义 Windows 用于搜索可执行文件的目录集。 若要确定当前所使用的版本,请在 Windows 命令提示符下运行bcp -v
命令。 有关如何在PATH
环境变量中设置命令路径的信息,请参阅 环境变量 或在 Windows 帮助中搜索环境变量。为确保运行的是最新版本的 bcp 实用工具,需要删除所有旧版本的 bcp 实用工具。
若要确定 bcp 实用工具的所有版本的安装位置,请在命令提示符下键入以下内容:
where bcp.exe
bcp 实用工具还可以与 Microsoft SQL Server 2016 功能包分开下载。 选择
ENU\x64\MsSqlCmdLnUtils.msi
或ENU\x86\MsSqlCmdLnUtils.msi
。只有当 SQL Server 工具和 SQL Server Native Client 一起安装后,才支持 XML 格式化文件。
有关在何处查找或如何运行 bcp 实用工具的信息以及有关命令提示实用工具语法约定的信息,请参阅 SQL 命令提示实用工具(数据库引擎)。
有关准备数据以进行批量导入或导出操作的信息,请参阅准备用于批量导出或导入的数据。
有关何时在事务日志中记录由批量导入执行的行插入操作的信息,请参阅批量导入的最小日志记录的先决条件。
-
字符
<
、>
、|
、&
和^
是特殊的命令 shell 字符,在字符串中使用这些字符时,必须在它们前面加上转义符 (^
) 或用引号将其引起来(例如"StringContaining&Symbol"
)。 如果使用引号将包含某个特殊字符的字符串引起来,则引号将设置为环境变量值的一部分。
本机数据文件支持
在 SQL Server 中,bcp 实用工具支持与 SQL Server 2000 (8.x) 及更高版本的 SQL Server 版本兼容的本机数据文件。
计算列和时间戳列
数据文件中针对计算列或 timestamp 列导入的值将被忽略, SQL Server 将自动分配该列的值。 如果数据文件不包含表中的计算列或时间戳列的值,则可使用格式化文件指定应在导入数据时忽略表中的计算列或时间戳列;SQL Server 将自动为该列分配值。
计算列和 timestamp 列会照常从 SQL Server 大容量复制到数据文件中。
指定包含空格或引号的标识符
SQL Server 标识符可以包含嵌入的空格和引号等字符。 此类标识符必须按以下方式处理:
如果在命令指示符处指定的标识符或文件名包含空格或引号,则需用英文双引号 ("") 将该标识符引起来。
例如,下面的
bcp out
命令创建了一个名为Currency Types.dat
的数据文件:bcp AdventureWorks2022.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
选项从数据文件导入标识值。
注意
在 SQL Server 2005 (9.x) 中,开始引入对目标表的 ALTER TABLE
权限要求。 如果用户帐户缺少对目标表的 ALTER TABLE
权限,则由于该要求,未强制执行触发器和约束检查的 bcp 脚本可能会失败。
字符模式 (-c
) 和本机模式 (-n
) 最佳做法
本节提供与字符模式 (-c
) 和本机模式 (-n
) 有关的一些建议。
(管理员/用户)应尽可能使用本机格式 (
-n
) 以避免分隔符问题。 使用本机格式可以使用 SQL Server进行导出和导入。 如果数据将导入到非 SQL Server 数据库,则使用-c
或-w
选项从 SQL Server 导出数据。(管理员)使用
bcp out
时验证数据。 例如,使用bcp out
、bcp in
,然后又使用bcp out
时,请验证数据是否正确导出,并确保终止符值不会作为某些数据值的一部分。 请考虑使用随机的十六进制值覆盖默认的终止符(使用-t
和-r
选项),以便避免终止符值和数据值之间的冲突。(用户)使用长且唯一的终止符(任意字节或字符序列)可以最大程度减少与实际字符串值冲突的可能性。 这可以通过使用
-t
和-r
选项实现。
示例
本节中的示例使用 SQL Server 2016 (13.x) 及更高版本的 WideWorldImporters
示例数据库、Azure SQL 数据库和 Azure SQL 托管实例。 可以通过 WideWorldImporters
下载 https://github.com/Microsoft/sql-server-samples/releases/tag/wide-world-importers-v1.0 。 有关用于还原示例数据库的语法,请参阅 RESTORE 语句。
示例测试条件
除了另行指定的位置,该示例假定你使用 Windows 身份验证,并且与运行 bcp 命令所针对的服务器实例之间具有可信连接。 在许多示例中都使用一个名为 D:\bcp
的目录。
以下 Transact-SQL 脚本创建 WideWorldImporters.Warehouse.StockItemTransactions
表的空副本,然后添加主键约束:
USE WideWorldImporters;
GO
SET NOCOUNT ON;
IF NOT EXISTS (SELECT *
FROM sys.tables
WHERE name = 'Warehouse.StockItemTransactions_bcp')
BEGIN
SELECT *
INTO WideWorldImporters.Warehouse.StockItemTransactions_bcp
FROM WideWorldImporters.Warehouse.StockItemTransactions
WHERE 1 = 2;
ALTER TABLE Warehouse.StockItemTransactions_bcp
ADD CONSTRAINT PK_Warehouse_StockItemTransactions_bcp
PRIMARY KEY NONCLUSTERED (StockItemTransactionID ASC);
END
可以按需截断 StockItemTransactions_bcp
表:
TRUNCATE TABLE WideWorldImporters.Warehouse.StockItemTransactions_bcp;
A. 标识 bcp 实用工具版本
在命令提示符处输入以下命令:
bcp -v
B. 将表行复制到数据文件中(使用信任连接)
以下示例阐释了 out
表中的 WideWorldImporters.Warehouse.StockItemTransactions
选项。
基本
此示例创建一个名为
StockItemTransactions_character.bcp
的数据文件,并使用 字符 格式将表数据复制到该文件中。在命令提示符处输入以下命令:
bcp WideWorldImporters.Warehouse.StockItemTransactions out D:\bcp\StockItemTransactions_character.bcp -c -T
扩展
此示例创建一个名为
StockItemTransactions_native.bcp
的数据文件,并使用 本机 格式将表数据复制到该文件中。 此示例还指定最大语法错误数、一个错误文件和一个输出文件。在命令提示符处输入以下命令:
bcp WideWorldImporters.Warehouse.StockItemTransactions OUT D:\bcp\StockItemTransactions_native.bcp -m 1 -n -e D:\bcp\Error_out.log -o D:\bcp\Output_out.log -S -T
查看 Error_out.log
和 Output_out.log
。 Error_out.log
应为空白。 比较 StockItemTransactions_character.bcp
与 StockItemTransactions_native.bcp
之间的文件大小。
C. 将表行复制到数据文件中(使用混合模式身份验证)
下面的示例阐释了 out
表中的 WideWorldImporters.Warehouse.StockItemTransactions
选项。 此示例创建一个名为 StockItemTransactions_character.bcp
的数据文件,并使用 字符 格式将表数据复制到该文件中。
该示例假定你使用混合模式身份验证,必须使用 -U
开关指定登录 ID。 并且,除非你连接到本地计算机上 SQL Server 的默认实例,否则请使用 -S
开关指定系统名称和实例名称(可选)。
在命令提示符处,输入以下命令:(系统将提示你输入密码。)
bcp WideWorldImporters.Warehouse.StockItemTransactions out D:\bcp\StockItemTransactions_character.bcp -c -U<login_id> -S<server_name\instance_name>
D. 将文件中的数据复制到表中
以下示例使用前面创建的文件阐明 in
表中的 WideWorldImporters.Warehouse.StockItemTransactions_bcp
选项。
基本
此示例使用以前创建的
StockItemTransactions_character.bcp
数据文件。在命令提示符处输入以下命令:
bcp WideWorldImporters.Warehouse.StockItemTransactions_bcp IN D:\bcp\StockItemTransactions_character.bcp -c -T
扩展
此示例使用以前创建的
StockItemTransactions_native.bcp
数据文件。 此示例还使用提示TABLOCK
,指定最大语法错误数、一个错误文件和一个输出文件。在命令提示符处输入以下命令:
bcp WideWorldImporters.Warehouse.StockItemTransactions_bcp IN D:\bcp\StockItemTransactions_native.bcp -b 5000 -h "TABLOCK" -m 1 -n -e D:\bcp\Error_in.log -o D:\bcp\Output_in.log -S -T
查看
Error_in.log
和Output_in.log
。
E. 将特定的列复制到数据文件中
若要复制特定列,可以使用 queryout
选项。 下面的示例仅将 StockItemTransactionID
表中的 Warehouse.StockItemTransactions
列复制到数据文件中。
在命令提示符处输入以下命令:
bcp "SELECT StockItemTransactionID FROM WideWorldImporters.Warehouse.StockItemTransactions WITH (NOLOCK)" queryout D:\bcp\StockItemTransactionID_c.bcp -c -T
F. 将特定的行复制到数据文件中
若要复制特定行,可以使用 queryout
选项。 以下示例仅将名为 Amy Trefl
的人员行从 WideWorldImporters.Application.People
表复制到数据文件 Amy_Trefl_c.bcp
中。
注意
-d
开关用于标识数据库。
在命令提示符处输入以下命令:
bcp "SELECT * from Application.People WHERE FullName = 'Amy Trefl'" queryout D:\bcp\Amy_Trefl_c.bcp -d WideWorldImporters -c -T
G. 将查询中的数据复制到数据文件中
若要将 Transact-SQL 语句的结果集复制到数据文件中,请使用 queryout
选项。 下面的示例将 WideWorldImporters.Application.People
表中的姓名复制到 People.txt
数据文件中;这些姓名按全名排序。
注意
-t
开关用于创建逗号分隔文件。
在命令提示符处输入以下命令:
bcp "SELECT FullName, PreferredName FROM WideWorldImporters.Application.People ORDER BY FullName" queryout D:\bcp\People.txt -t, -c -T
H. 创建格式化文件
下面的示例为 Warehouse.StockItemTransactions
数据库中的 WideWorldImporters
表创建三个不同格式文件。 查看创建的每个文件的内容。
在命令提示符处输入以下命令:
REM non-XML character format
bcp WideWorldImporters.Warehouse.StockItemTransactions format nul -f D:\bcp\StockItemTransactions_c.fmt -c -T
REM non-XML native format
bcp WideWorldImporters.Warehouse.StockItemTransactions format nul -f D:\bcp\StockItemTransactions_n.fmt -n -T
REM XML character format
bcp WideWorldImporters.Warehouse.StockItemTransactions format nul -f D:\bcp\StockItemTransactions_c.xml -x -c -T
注意
若要使用 -x
开关,则必须使用 bcp 9.0 客户端。 有关如何使用 bcp 9.0 客户端的信息,请参阅 备注 部分。
有关详细信息,请参阅使用非 XML 格式文件 (SQL Server) 和 XML 格式文件 (SQL Server)。
I. 使用格式化文件进行 bcp 批量导入
向 SQL Server的实例中导入数据时,若要使用以前创建的格式化文件,请同时使用 -f
开关和 in
选项。 例如,以下命令通过使用以前创建的格式化文件 ( StockItemTransactions_character.bcp
),将数据文件 Warehouse.StockItemTransactions_bcp
的内容大容量复制到 StockItemTransactions_c.xml
表的副本中。
注意
-L
开关用于仅导入前 100 个记录。
在命令提示符处输入以下命令:
bcp WideWorldImporters.Warehouse.StockItemTransactions_bcp in D:\bcp\StockItemTransactions_character.bcp -L 100 -f D:\bcp\StockItemTransactions_c.xml -T
注意
如果数据文件字段和表中的列不同(例如,在编号、排序或数据类型方面),则可使用格式化文件。 有关详细信息,请参阅导入或导出数据的格式文件 (SQL Server)。
J. 指定一个代码页
以下部分代码示例显示了指定代码页 65001 时使用的 bcp import 语句:
bcp MyTable in "D:\data.csv" -T -c -C 65001 -t , ...
K. 使用自定义字段和行终止符的示例输出文件
此示例演示了两个示例文件,这些文件由 bcp 使用自定义字段和行终止符生成。
在
dbo.T1
数据库中创建一个表tempdb
,其中包含两列,即ID
和Name
。USE tempdb; GO CREATE TABLE dbo.T1 (ID INT, [Name] NVARCHAR (20)); GO INSERT INTO dbo.T1 VALUES (1, N'Natalia'); INSERT INTO dbo.T1 VALUES (2, N'Mark'); INSERT INTO dbo.T1 VALUES (3, N'Randolph'); GO
使用自定义字段终止符从示例表
dbo.T1
生成输出文件。在此示例中,服务器名称
MYSERVER
,-t ,
指定自定义字段终止符。bcp dbo.T1 out T1.txt -T -S MYSERVER -d tempdb -w -t ,
结果集如下。
1,Natalia 2,Mark 3,Randolph
使用自定义字段终止符和自定义行终止符从示例表
dbo.T1
生成输出文件。在此示例中,服务器名称
MYSERVER
,-t ,
指定自定义字段终止符,-r :
指定自定义行终止符。bcp dbo.T1 out T1.txt -T -S MYSERVER -d tempdb -w -t , -r :
结果集如下。
1,Natalia:2,Mark:3,Randolph:
注意
将始终添加行终止符,它甚至会添加到最后一条记录中。 但是,字段终止符不会添加到最后一个字段。
其他示例
以下文章包含有关使用 bcp 的示例:
批量导入或批量导出的数据格式(SQL Server)
格式化文件以导入或导出数据(SQL Server)
相关内容
- 准备用于批量导出或导入的数据
- BULK INSERT (Transact-SQL)
- OPENROWSET (Transact-SQL)
- SET QUOTED_IDENTIFIER (Transact-SQL)
- sp_configure (Transact-SQL)
- sp_tableoption (Transact-SQL)
- 导入或导出数据的格式文件 (SQL Server)
获取帮助
- SQL 意见:是否有改进 SQL Server 的建议?
- Microsoft Q&A (SQL Server)
- DBA Stack Exchange (tag sql-server):询问 SQL Server 相关问题
- Stack Overflow (tag sql-server):有关 SQL 开发问题的答案
- Reddit:有关 SQL Server 的一般讨论
- Microsoft SQL Server 许可条款和许可证信息
- 企业用户支持选项
- 其他 SQL Server 帮助和反馈
参与编辑 SQL 文档
你是否知道你可以自行编辑 SQL 内容? 你如果这样做,不仅可以帮助改进我们的文档,还可以获得页面贡献者的殊荣。
有关详细信息,请参阅如何参与 SQL Server 文档编辑