使用 bcp 创建格式化文件 (SQL Server)

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Azure Synapse AnalyticsAnalytics Platform System (PDW)

本文说明如何使用 bcp 实用工具为特定表创建格式化文件。 格式化文件基于指定的数据类型选项(-n-c-w-N)以及表或视图分隔符。

批量导入 SQL Server 表或从表批量导出数据时,可以使用格式化文件作为灵活的系统来写入数据文件。 格式文件只需进行极少的编辑甚至无需编辑即可编写出符合其他数据格式的数据文件,或从其他软件程序读取数据文件。

限制

用于读取格式文件的 bcp 实用工具(bcp.exe)的版本,必须与用于创建该格式文件的版本相同或更新。 例如,SQL Server 2025(17.x)bcp可以读取由 SQL Server 2022(16.x)bcp生成的版本 16.0 格式文件,但 SQL Server 2022(16.x)bcp无法读取由 SQL Server 2025(17.x)bcp生成的版本 17.0 格式文件。

注意

Azure Synapse Analytics不支持此语法(包括批量插入)。 在 Azure Synapse Analytics 和其他云数据库平台集成中,通过 Azure 数据工厂中的 COPY 语句或使用 T-SQL 语句(如 COPY INTO)和 PolyBase 完成数据移动。

创建格式化文件

SQL Server 支持两种格式文件:非 XML 格式和 XML 格式。 非 XML 格式是 SQL Server 早期版本支持的原始格式。

通常,XML 与非 XML 格式化文件可以互换。 但是,建议您为格式化文件使用 XML 语法,因为与非 XML 格式化文件相比,格式化文件具有多项优点。

本文中的代码示例使用 AdventureWorks2025AdventureWorksDW2025 示例数据库,可以从 Microsoft SQL Server 示例和社区项目 主页下载该数据库。 Adventure Works Cycles 是一家虚构的制造公司,用于演示数据库概念和方案。

创建格式文件

要创建 bcp 格式文件,请指定 format 参数并使用 nul 代替数据文件路径。 选择 format 总是需要选择 -f

要创建XML格式文件,您必须指定 -x 该选项,例如 bcp <table_or_view> format nul -f <format_file_name> -x

为了区分XML格式文件,可以使用.xml文件扩展名,例如。 MyTable.xml

有关XML格式文件的结构和字段信息,请参见 XML格式文件

示例

本节包含说明如何使用 bcp 创建格式文件的示例。 HumanResources.Department 表包含四列: DepartmentIDNameGroupNameModifiedDate

A. 为字符数据创建格式文件

以下示例使用字符数据格式为表创建格式文件 HumanResources.Department

创建一个名为 Department-c.xml的 XML 格式文件。 格式文件使用非默认字段终止符(,)。 以下部分展示了生成格式文件的内容。

bcp 命令包含以下限定词。

限定符 说明
format nul -x -f <format_file> 指定 XML 格式化文件。
-c 指定字符数据。
-t, 将逗号 (,) 指定为字段终止符。

请注意:如果数据文件使用默认的字段终止符 (\t),则不需要 -t 开关。
-T 指定 bcp 使用集成安全通过受信任连接连接到 SQL Server。 如果您未指定 -T,您必须指定 -U-P ,才能成功登录。

在 Windows 命令提示符下,输入以下 bcp 命令:

bcp AdventureWorks2025.HumanResources.Department format nul -c -x -f Department-c.xml -t, -T

生成的格式化文件 Department-c.xml包含以下 XML 元素:

<?xml version="1.0"?>
<BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<RECORD>
  <FIELD ID="1" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="7"/>
  <FIELD ID="2" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="100" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
  <FIELD ID="3" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="100" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
  <FIELD ID="4" xsi:type="CharTerm" TERMINATOR="\r\n" MAX_LENGTH="24"/>
</RECORD>
<ROW>
  <COLUMN SOURCE="1" NAME="DepartmentID" xsi:type="SQLSMALLINT"/>
  <COLUMN SOURCE="2" NAME="Name" xsi:type="SQLNVARCHAR"/>
  <COLUMN SOURCE="3" NAME="GroupName" xsi:type="SQLNVARCHAR"/>
  <COLUMN SOURCE="4" NAME="ModifiedDate" xsi:type="SQLDATETIME"/>
</ROW>
</BCPFORMAT>

有关该格式文件语法的信息,请参见 XML格式文件。 有关字符数据的信息,请参见 使用字符格式导入或导出数据

B. 为本地数据创建格式文件

以下示例使用原生数据类型为表创建格式文件 HumanResources.Department

创建一个名为 Department-n.xml的 XML 格式文件。 以下部分展示了生成格式文件的内容。

bcp 命令包含以下限定词。

限定符 说明
format nul -x -f <format_file> 指定 XML 格式化文件。
-n 指定原生数据类型。
-T 指定 bcp 使用集成安全通过受信任连接连接到 SQL Server。 如果您未指定 -T,您必须指定 -U-P ,才能成功登录。

在 Windows 命令提示符下,输入以下 bcp 命令:

bcp AdventureWorks2025.HumanResources.Department format nul -x -f Department-n.xml -n -T

生成的格式化文件 Department-n.xml包含以下 XML 元素:

<?xml version="1.0"?>
<BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<RECORD>
  <FIELD ID="1" xsi:type="NativeFixed" LENGTH="2"/>
  <FIELD ID="2" xsi:type="NCharPrefix" PREFIX_LENGTH="2" MAX_LENGTH="100" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
  <FIELD ID="3" xsi:type="NCharPrefix" PREFIX_LENGTH="2" MAX_LENGTH="100" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
  <FIELD ID="4" xsi:type="NativeFixed" LENGTH="8"/>
</RECORD>
<ROW>
  <COLUMN SOURCE="1" NAME="DepartmentID" xsi:type="SQLSMALLINT"/>
  <COLUMN SOURCE="2" NAME="Name" xsi:type="SQLNVARCHAR"/>
  <COLUMN SOURCE="3" NAME="GroupName" xsi:type="SQLNVARCHAR"/>
  <COLUMN SOURCE="4" NAME="ModifiedDate" xsi:type="SQLDATETIME"/>
</ROW>
</BCPFORMAT>

有关该格式文件语法的信息,请参见 XML格式文件。 有关如何使用原生数据的信息,请参见 使用原生格式导入或导出数据

C. 为 Unicode 本机数据创建非 XML 格式化文件

若要为 HumanResources.Department 表中的 Unicode 本机数据创建非 XML 格式化文件,请使用以下命令:

bcp AdventureWorks2025.HumanResources.Department format nul -T -N -f Department-n.fmt

有关如何使用Unicode本地数据的更多信息,请参见 “使用Unicode本地格式导入或导出数据”。

D. 为 Unicode 字符数据创建非 XML 格式化文件

若要为 HumanResources.Department 表中使用默认终止符的 Unicode 字符数据创建非 XML 格式化文件,请使用以下命令:

bcp AdventureWorks2025.HumanResources.Department format nul -T -w -f Department-w.fmt

有关如何使用Unicode字符数据的更多信息,请参见 使用Unicode字符格式导入或导出数据

E. 使用具有代码页选项的格式化文件

使用 bcp format 创建格式文件时,会将有关排序规则和代码页的信息写入该格式文件。

具有 5 列的表的以下示例格式化文件包括了排序规则。

13.0
5
1  SQLCHAR         0       0       "\t"             1     c_0          Cyrillic_General_CS_AS
2  SQLCHAR         0       0       "\t"             2     c_1          Cyrillic_General_CS_AS
3  SQLCHAR         0       3000    "\t"             3     c_2          Cyrillic_General_CS_AS
4  SQLCHAR         0       5       "\t"             4     c_3          ""
5  SQLCHAR         0       41      "!!!\r\r\n"      5     c_4          ""

如果你尝试使用 bcp in -c -C65001 -f format_file ...,或使用 BULK INSERT,或将 OPENROWSETFORMATFILE='format_file' CODEPAGE=65001 ... 一起使用来将数据导入 SQL Server,则格式文件中的排序规则或代码页信息的优先级高于 65001 选项。

因此,如果你生成格式文件,必须手动删除生成格式文件中的校对信息,然后再开始将数据导入 SQL Server。

以下示例展示了没有校对信息的格式文件。

13.0
5
1  SQLCHAR         0       0       "\t"             1     c_0              ""
2  SQLCHAR         0       0       "\t"             2     c_1              ""
3  SQLCHAR         0       3000    "\t"             3     c_2              ""
4  SQLCHAR         0       5       "\t"             4     c_3              ""
5  SQLCHAR         0       41      "!!!\r\r\n"      5     c_4              ""

将数据字段映射到表列

创建的 bcp 格式文件描述了所有表列的顺序。 你可以修改格式文件,重新排列或省略表格列。 您可以针对字段未直接映射到表列的数据文件来自定义格式化文件。 有关详细信息,请参阅以下文章: