bcp 实用工具

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Azure Synapse AnalyticsAnalytics 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 语法约定

下载最新版本的 bcp 实用工具

命令行工具为公开发行版 (GA),但与 SQL Server 2019 (15.x) 及更高版本的安装程序包一起发布。

Windows

Linux 和 macOS

有关在 Linux 和 macOS 上安装 sqlcmdbcp 的说明,请参阅在 Linux 上安装 SQL Server 命令行工具 sqlcmd 和 bcp

版本信息

  • 版本号: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 或更高版本。

注意

在 Linux 上还可使用 sqlcmdbcp。 有关详细信息,请参阅在 Linux 上安装 SQL Server 命令行工具 sqlcmd 和 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]
    [-D]
    [-e err_file]
    [-E]
    [-f format_file]
    [-F first_row]
    [-G Azure Active Directory 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]
    [-v]
    [-V (80 | 90 | 100 | 110 | 120 | 130 | 140 | 150 | 160 ) ]
    [-w]
    [-x]

命令行选项

database_name

指定的表或视图所在数据库的名称。 如果未指定,则使用用户的默认数据库。

也可以使用 -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 }

指定该数据文件中数据的代码页。 仅当数据含有字符值大于 127 或小于 32 的code_pagecode_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

指定格式化文件的完整路径。 此选项的含义取决于使用它的环境,具体如下:

  • 如果 -fformat 选项一起使用,则将为指定的表或视图创建指定的 format_file 。 若要创建 XML 格式化文件,请同时指定 -x 选项。 有关详细信息,请参阅创建格式化文件 (SQL Server)

  • 如果与 inout 选项一起使用,则 -f 需要一个现有的格式化文件。

    注意

    可以选择将格式化文件与 inout 选项一起使用。 如果没有 -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,请执行下列操作:

    1. 按键盘上的 Windows 键
    2. 键入 ODBC 并选择 ODBC 数据源管理器的相应版本
    3. 选择“用户 DSN”或“系统 DSN”选项卡
    4. 选择“添加”,然后按提示进行操作
    5. 当系统要求提供身份验证类型时,请选择“Azure 托管服务标识身份验证
    6. 如果有用户分配的托管标识,请将该标识的 Object (principal) ID 粘贴到“身份验证”选项卡底部的“登录 ID”框中
    7. 继续按照提示配置 DSN

    有关包括屏幕截图的完整演练,请参阅在 UI 中创建和编辑 DSN

    配置 DSN 后,可以使用 标志调用 -D,以指示为 -S 传递的值是 DSN。

    bcp bcptest out "c:\last\data1.dat" -c -D -S myDSN -d testdb
    

  • Microsoft Entra ID 访问令牌

    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 传递给 -AccountIdConnect-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 交互式

    Microsoft Entra 交互式身份验证适用于所有 Azure SQL 和 SQL Server 2022+,可使用交互式对话框进行身份验证,该对话框还支持多重身份验证。

    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 租户中,并且属于 SQL 数据库中存在的包含执行 bcp 命令的数据库权限的组,则将使用其来宾用户别名(例如,keith0@adventure-works.com)。

-h "hints [, ... n]"

指定向表或视图中大容量导入数据时要用到的提示。

  • 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 bulk load 决定。

    注意

    如果目标表是聚集列存储索引,则多个并发客户端不需要 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,则不会运行任何插入触发器操作。 对于 outqueryoutformat 参数,将忽略 FIRE_TRIGGERS。

-i input_file

指定响应文件的名称,其中包含在交互模式(未指定 -n-c-w-N)下执行大容量复制时,对该命令要求输入每个数据字段的提示信息所做出的响应。

如果 input_file 以连字符 () 或正斜杠 (-) 开头,则不要在 / 与 input_file 值之间包含空格。

-k

指定在操作过程中空列应该保留 null 值,而不是所插入列的任何默认值。 有关详细信息,请参阅在批量导入期间保留 Null 或使用默认值 (SQL Server)

-K application_intent

连接到服务器时声明应用程序工作负荷类型。 唯一可能的值是 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 选项也不适用于转换 moneybigint 数据类型。

-n

使用数据的本机(数据库)数据类型执行大容量复制操作。 此选项不提示输入每个字段,它将使用本机值。

有关详细信息,请参阅使用本机格式导入或导出数据 (SQL Server)

-N

执行大容量复制操作时,对非字符数据使用本机(数据库)数据类型的数据,对字符数据使用 Unicode 字符。 此选项是 -w 选项的一个替代选项,并具有更高的性能。此选项主要用于通过数据文件将数据从一个 SQL Server 实例传送到另一个实例。 此选项不提示输入每个字段。 如果要传送包含 ANSI 扩展字符的数据,并希望利用本机模式的性能优势,则可使用此选项。

有关详细信息信息,请参阅使用 Unicode 本机格式导入或导出数据 (SQL Server)

如果通过将 bcp-N 一起使用来导出数据后又将数据导入到同一表架构中,则在存在固定长度的非 Unicode 字符列(例如 char(10))的情况下,系统可能会显示截断警告。

可忽略该警告。 解决此警告的一个方法是使用 -n 来替代 -N

-o output_file

指定文件名称,该文件用于接收从命令提示符重定向来的输出。

如果 output_file 以连字符 () 或正斜杠 (-) 开头,则不要在 / 与 output_file 值之间包含空格。

-P password

指定登录 ID 的密码。 如果未使用此选项,bcp 命令将提示输入密码。 如果在命令提示符的末尾使用此选项,但不提供密码,则 bcp 将使用默认密码 (NULL)。

重要

不要使用空密码。 请使用强密码。

若要屏蔽密码,请不要同时指定 -P-U 选项。 而应在指定 bcp 以及 选项和其他开关(不要指定 -U)之后按 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 实例。 如果未指定服务器,则 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。

-v

报告 bcp 实用工具的版本号和版权信息。

-V (80 | 90 | 100 | 110 | 120 | 130 | 140 | 150 | 160)

使用 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

此选项与 format-f format_file 选项结合使用,可生成基于 XML 的格式化文件,而不是默认的非 XML 格式化文件。 在导入或导出数据时,-x 不起作用。 如果不与 format-f format_file 一起使用,则将生成错误。

注解

  • 安装 Microsoft SQL Server 2019 (15.x) 工具时,将安装 bcp 13.0 客户端。 如果为多个版本的 SQL Server 安装了工具,则你使用的可能是早期版本的 bcp 客户端,而不是 bcp 13.0 客户端,具体取决于 PATH 环境变量的值的顺序 。 此环境变量定义 Windows 用于搜索可执行文件的目录集。 若要确定当前所使用的版本,请在 Windows 命令提示符下运行 bcp -v 命令。 有关如何在 PATH 环境变量中设置命令路径的信息,请参阅环境变量或在 Windows 帮助中搜索环境变量。

    为确保运行的是最新版本的 bcp 实用工具,需要删除所有旧版本的 bcp 实用工具。

    若要确定 bcp 实用工具的所有版本的安装位置,请在命令提示符下键入以下内容:

    where bcp.exe
    
  • bcp 实用工具还可以与 Microsoft SQL Server 2016 功能包分开下载。 选择 ENU\x64\MsSqlCmdLnUtils.msiENU\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 选项从数据文件导入标识值。

注意

要求对目标表具有 ALTER TABLE 权限是 SQL Server 2005 (9.x)的新要求。 如果用户帐户不具有对目标表的 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 的目录。

以下脚本创建 WideWorldImporters.Warehouse.StockItemTransactions 表的空副本,然后添加主键约束。 在 SQL Server Management Studio (SSMS) 中运行以下 T-SQL 脚本

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.logOutput_out.logError_out.log 应为空白。 比较 StockItemTransactions_character.bcpStockItemTransactions_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.logOutput_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 使用自定义字段和行终止符生成。

  1. dbo.T1 数据库中创建一个表 tempdb,其中包含两列,即 IDName

    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
    
  2. 使用自定义字段终止符从示例表 dbo.T1 生成输出文件。

    在此示例中,服务器名称为 MYSERVER,自定义字段终止符由 -t , 指定。

    bcp dbo.T1 out T1.txt -T -S MYSERVER -d tempdb -w -t ,
    

    结果集如下。

    1,Natalia
    2,Mark
    3,Randolph
    
  3. 使用自定义字段终止符和自定义行终止符从示例表 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 的示例:

注意事项和限制

  • bcp 实用工具有一个限制,即错误消息仅显示 512 字节字符。 仅显示错误消息的前 512 个字节。

获取帮助

参与编辑 SQL 文档

你是否知道你可以自行编辑 SQL 内容? 你如果这样做,不仅可以帮助改进我们的文档,还可以获得页面贡献者的殊荣。

有关详细信息,请参阅如何参与 SQL Server 文档编辑