XML 格式化文件 (SQL Server)

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

SQL Server 提供了一种 XML 架构,该架构定义了编写 XML 格式文件以将数据批量导入 SQL Server 表中的语法。 XML 格式化文件必须符合用 XML 架构定义语言 (XSDL) 定义的这种架构。 只有当 SQL Server 工具和 SQL Server Native Client 一起安装后,才支持 XML 格式化文件。

可以将 XML 格式化文件与 bcp 命令、BULK INSERT 语句或 INSERT ... SELECT * FROM OPENROWSET(BULK...) 语句一起使用。 bcp 命令允许自动生成表的 XML 格式化文件;有关详细信息,请参阅 bcp 实用工具

大容量导出和导入支持两种类型的格式化文件: 非 XML 格式化文件XML 格式化文件。 XML 格式化文件比非 XML 格式化文件更灵活,功能更强大。 有关非 XML 格式化文件的信息,请参阅 使用非 XML 格式化文件(SQL Server)

注意

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

XML 格式化文件的优点

XML 格式化文件是自描述型,因此易于阅读、 创建和扩展。 它们是人类可读的,因此,可以轻松了解在批量操作期间如何解释数据。

XML 格式化文件包含目标列的数据类型。 XML 编码清晰地描述了数据文件的数据类型和数据元素以及数据元素和表列之间的映射。

这可以将数据文件中数据的表示形式与文件中每个字段相关联的数据类型分离开来。 例如,如果数据文件包含字符表示形式的数据,则相应的 SQL 列类型会丢失。

XML 格式化文件允许从数据文件加载包含单一大型对象 (LOB) 数据类型的字段。

XML 格式化文件得以增强的同时,仍与早期版本保持兼容。 此外,XML 编码清晰,有利于为给定数据文件创建多个格式化文件。 这有助于将所有或某些数据字段映射到不同表或视图中的列。

XML 语法与操作的方向无关;即大容量导出和大容量导入中使用的语法相同。

使用 XML 格式化文件,可以将数据大容量导入表或非分区视图,并可以大容量导出数据。

指定目标表是 OPENROWSET(BULK...) 函数的可选项。 这是因为该函数依赖 XML 格式化文件从数据文件中读取数据。

注意

bcp 命令和 BULK INSERT 语句需要使用目标表,因为它们使用目标表列执行类型转换。

XML 格式化文件的结构

和非 XML 格式化文件一样,XML 格式化文件定义数据文件中数据字段的格式和结构,并将这些数据字段映射到单个目标表中的相应列。

XML 格式化文件具有两个主要组件,<RECORD><ROW>

  • <RECORD> 描述了数据在数据文件中存储的方式。

    每个 <RECORD> 元素都包含一组或多个 <FIELD> 元素。 这些元素与数据文件中的字段相对应。 基本语法如下:

    <RECORD>
        <FIELD .../> [ ...n ]
    </RECORD>
    

    每个 <FIELD> 元素描述特定数据字段的内容。 一个字段只能映射到表中的一列, 并不是所有字段都需要映射到列。

    数据文件中字段的长度可以是固定或可变的,也可以由字符结尾。 字段值 可以表示为:字符(使用单字节表示形式)、宽字符(使用 Unicode 2 字节表示形式)、本机数据库格式或文件名。 如果字段值为文件名,则文件名指向包含目标表中 BLOB 列的值的文件。

  • <ROW> 介绍如何在将数据从文件导入 SQL Server 表时从数据文件构造数据行。

    <ROW> 元素包含一组 <COLUMN> 元素。 这些元素与表格列相对应。 基本语法如下:

    <ROW>
        <COLUMN .../> [ ...n ]
    </ROW>
    

    每个 <COLUMN> 元素只能映射到数据文件中的一个字段。 <ROW> 元素中 <COLUMN> 元素的顺序定义批量操作返回它们的顺序。 XML 格式化文件为每个 <COLUMN> 元素分配一个本地名称,该名称与大容量导入作的目标表中的列没有关系。

XML 格式化文件的架构语法

本节概要介绍 XML 格式化文件的 XML 架构的元素和属性。 格式化文件的语法与操作的方向无关;即大容量导出和大容量导入中使用的语法相同。 本部分还考虑批量导入如何使用 <ROW><COLUMN> 元素,以及如何将元素 xsi:type 值放入数据集中。

要查看该语法与实际的 XML 格式化文件的对应关系,请参阅 XML 格式化文件示例

注意

您可以修改格式化文件,以便从字段编号和/或顺序与表列的编号和/或顺序不同的数据文件进行大容量导入。 有关详细信息,请参阅 格式化文件以导入或导出数据(SQL Server)

XML 架构的基本语法

这些语法语句仅显示元素(<BCPFORMAT><RECORD><FIELD><ROW><COLUMN>)及其基本属性。

注意

本文后面将介绍与 <FIELD><COLUMN> 元素中 xsi:type 的值关联的其他属性。

架构元素

本节总结了 XML 架构为 XML 格式化文件定义的每个元素的作用。 本文后面的各节将介绍这些属性。

  • <BCPFORMAT>

    用于定义给定数据文件的记录结构的格式化文件元素及其与表中表行列的对应关系。

  • <RECORD .../>

    定义包含一个或多个 <FIELD> 元素的复杂元素。 在格式化文件中声明的字段的顺序与那些字段在数据文件中出现的顺序相同。

  • <FIELD .../>

    定义数据文件中的字段,用来容纳数据。 本文将在后面的 <FIELD> 元素的属性中讨论此元素的属性。

  • <ROW .../>

    定义包含一个或多个 <COLUMN> 元素的复杂元素。 <COLUMN> 元素的顺序独立于 RECORD 定义中 <FIELD> 元素的顺序。 相反,格式化文件中 <COLUMN> 元素的顺序决定了生成的行集的列顺序。 数据字段按相应 <COLUMN> 元素在 <COLUMN> 元素中声明的顺序加载。 有关详细信息,请参阅本文后面的 批量导入如何使用 <ROW> 元素

  • <COLUMN>

    将列定义为元素(<COLUMN>)。 每个 <COLUMN> 元素对应于一个 <FIELD> 元素(其 ID 是在 <COLUMN> 元素的 SOURCE 属性中指定的)。 本文在稍后的 <COLUMN> 元素属性 中讨论该元素的属性。 另请参阅本文后面的 批量导入如何使用 <COLUMN> 元素

  • </BCPFORMAT>

    用于结束格式化文件。

<FIELD> 元素的属性

本部分介绍 <FIELD> 元素的属性,这些属性在以下架构语法中汇总:

<FIELD
ID ="fieldID"
xsi:type ="fieldType"
[ LENGTH ="n" ]
[ PREFIX_LENGTH ="p" ]
[ MAX_LENGTH ="m" ]
[ COLLATION ="collationName" ]
[ TERMINATOR ="terminator" ]
/>

每个 <FIELD> 元素都独立于其他元素。 字段是通过下列属性进行描述的:

FIELD 属性 说明 可选/
必需
ID="fieldID" 指定数据文件中的字段的逻辑名称。 字段的 ID 是用于引用字段的键。

<FIELD ID="fieldID" /> 映射到 <COLUMN SOURCE="fieldID" />
必需
xsi:type="fieldType" 这是一个 XML 构造,用法类似于属性。它定义元素实例的类型。 在给定的实例中,fieldType 的值决定您需要哪些 可选属性 必需(取决于数据类型)
LENGTH="n" 此属性定义固定长度的数据类型实例的长度。

n 值必须是正整数。
除非xsi:type值要求,否则为可选
PREFIX_LENGTH="p" 此属性定义二进制数据表示形式的前缀的长度。 PREFIX_LENGTHp,必须是以下值之一:1248 除非是 xsi:type 值所必需,否则可选
MAX_LENGTH=“m 此属性为给定字段中可以存储的最大字节数。 如果没有目标表,列的最大长度未知。 MAX_LENGTH 属性限制输出字符列的最大长度,从而限制为列值分配的存储。 在 SELECT FROM 子句中使用 OPENROWSET 函数的 BULK 选项时,这可以提供很大的方便。

m 值必须是正整数。 默认情况下,字符 列的最大长度为 8,000 个字符,nchar 列的最大长度为 4,000 个字符。
可选
COLLATION="collationName" COLLATION 仅适用于字符字段。 有关 SQL Server 排序规则名称的列表,请参阅 SQL Server 排序规则名称 可选
TERMINATOR="terminator" 此属性指定数据字段的终止符。 该终止符可以是任意字符。 终止符必须是一个不属于数据的独特字符。

默认情况下,字段终止符为制表符(表示为 \t)。 若要表示段落标记,请使用 \r\n
此属性只能与需要此属性的字符数据 xsi:type 一起使用。

  • <FIELD> 元素的 xsi:type

    xsi:type 值是一个 XML 构造(如属性),用于标识元素实例的数据类型。 有关详细信息,请参阅本文中的将 xsi:type 值放入数据集部分。

    <FIELD> 元素的 xsi:type 值支持以下数据类型。

    <FIELD>xsi:type 必需的 XML 属性
    适用于数据类型
    可选 XML 属性
    适用于数据类型
    NativeFixed LENGTH 无。
    NativePrefix PREFIX_LENGTH MAX_LENGTH
    CharFixed LENGTH COLLATION
    NCharFixed LENGTH COLLATION
    CharPrefix PREFIX_LENGTH MAX_LENGTHCOLLATION
    NCharPrefix PREFIX_LENGTH MAX_LENGTHCOLLATION
    CharTerm TERMINATOR MAX_LENGTHCOLLATION
    NCharTerm TERMINATOR MAX_LENGTHCOLLATION

    有关 SQL Server 数据类型的详细信息,请参阅 数据类型

  • <COLUMN> 元素的属性

    本部分介绍 <COLUMN> 元素的属性,这些属性在以下架构语法中汇总:

    <COLUMN
    SOURCE = "fieldID"
    NAME = "columnName"
    xsi:type = "columnType"
    [ LENGTH = "n" ]
    [ PRECISION = "n" ]
    [ SCALE = "value" ]
    [ NULLABLE = { "YES" | "NO" } ]
    />
    

    使用下列属性将字段映射到目标表中的列:

    COLUMN 属性 说明 可选/
    必需
    SOURCE="fieldID" 指定映射到列的字段 ID。

    <COLUMN SOURCE=fieldID"/> 映射到 <FIELD ID=fieldID"/>
    必需
    NAME="columnName" 指定格式化文件所表示的行集中的列名。 此列名用于标识结果集中的列,并且该列不需要与目标表中使用的列名相对应。 必需
    xsi:type="ColumnType" 这是一个 XML 构造,用法类似于属性。它定义元素实例的数据类型。 ColumnType 的值决定了在给定实例中需要哪些 可选属性

    注意:<COLUMN> 元素的 xsi:type 值部分中的 <COLUMN> 元素表列出了 ColumnType 的可能值及其相关属性
    可选
    LENGTH="n" 定义固定长度的数据类型实例的长度。 仅当 xsi:type 为字符串数据类型时,才使用 LENGTH

    n 值必须是正整数。
    可选(仅当 xsi:type 为字符串数据类型时才可用)
    PRECISION="n" 指示数字的位数。 例如,数 123.45 精度为 5。

    该值必须是正整数。
    可选(仅当 xsi:type 为可变数数据类型时可用)
    SCALE="int" 指示数字中小数点右边的位数。 例如,数字 123.45 的小数位数为 2。

    该值必须为整数。
    可选(仅当 xsi:type 为可变数数据类型时可用)
    NULLABLE={ "YES" | "NO" } 指示列是否可以接受 NULL 值。 此属性独立于 FIELDS。 但是,如果列不可为 null,而字段指定为 NULL(未指定任何值),将产生运行时错误。

    仅当执行普通的 SELECT FROM OPENROWSET(BULK...) 语句时,才会使用 NULLABLE 属性。
    可选(任何数据类型均可用)

  • <COLUMN> 元素的 xsi:type

    xsi:type 值是一个 XML 构造(如属性),用于标识元素实例的数据类型。 有关使用“将 xsi:type 值放入数据集”的信息,请参阅本部分的后面部分。

    <COLUMN> 元素支持本地 SQL 数据类型,如下所示:

    类型类别 <COLUMN> 数据类型 必需的 XML 属性
    适用于数据类型
    可选 XML 属性
    适用于数据类型
    固定 SQLBITSQLTINYINTSQLSMALLINTSQLINTSQLBIGINTSQLFLT4SQLFLT8SQLDATETIMESQLDATETIM4SQLDATETIM8SQLMONEYSQLMONEY4SQLVARIANTSQLUNIQUEID 无。 NULLABLE
    变量号 SQLDECIMALSQLNUMERIC 无。 NULLABLEPRECISIONSCALE
    可变日期和时间 SQLDATETIME2SQLTIMESQLDATETIMEOFFSET 无。 NULLABLESCALE
    LOB SQLIMAGECharLOBSQLTEXTSQLUDT 无。 NULLABLE
    字符 LOB SQLNTEXT 无。 NULLABLE
    二进制字符串 SQLBINARYSQLVARYBIN 无。 NULLABLELENGTH
    字符串 SQLCHARSQLVARYCHARSQLNCHARSQLNVARCHAR 无。 NULLABLELENGTH

    重要

    若要批量导出或导入 SQLXML 数据,请在格式化文件中使用以下数据类型之一:SQLCHARSQLVARYCHAR(数据在客户端代码页或排序规则隐含的代码页中发送)、SQLNCHARSQLNVARCHAR(数据作为 Unicode 发送)或 SQLBINARYSQLVARYBIN(数据发送时没有任何转换)。

    有关 SQL Server 数据类型的详细信息,请参阅 数据类型

批量导入如何使用 <ROW> 元素

在某些上下文中忽略 <ROW> 元素。 <ROW> 元素是否影响批量导入操作取决于操作的执行方式:

  • bcp 命令

    将数据加载到目标表中时,bcp 将忽略 <ROW> 组件。 相反, bcp 根据目标表的列类型来加载数据。

  • Transact-SQL 语句(BULK INSERTOPENROWSET 的批量行集提供程序)

    将数据批量导入表中时,Transact-SQL 语句使用 <ROW> 组件生成输入行集。 此外,Transact-SQL 语句根据 <ROW> 下指定的列类型和目标表中的相应列执行适当的类型转换。 如果格式化文件和目标表中指定的列类型之间存在不匹配,还将进行额外的类型转换。 与 bcp 相比,此额外的类型转换可能导致 BULK INSERTOPENROWSET 的批量行集提供程序中的行为出现某些差异(即损失精度)

    <ROW> 元素中的信息允许构造行,而无需任何其他信息。 因此,可以使用 SELECT 语句(SELECT * FROM OPENROWSET(BULK <data-file> FORMATFILE=<xml-format-file>)生成行集。

    OPENROWSET BULK 子句需要一个格式化文件。 只能使用 XML 格式化文件将字段的数据类型转换为列的数据类型。

批量导入如何使用 <COLUMN> 元素

若要将数据批量导入表中,格式化文件中的 <COLUMN> 元素通过指定将数据文件字段映射到表列:

  • 行中每个字段在数据文件中的位置。

  • 列类型,用于将字段数据类型转换为所需的列数据类型。

如果未将列映射到字段,则不会将字段复制到生成的行中。 此行为使得数据文件能够在不同的表中生成含有不同列的行。

同样,对于从表批量导出数据,格式化文件中的每个 <COLUMN> 会将输入表行中的列映射到输出数据文件中的相应字段。

xsi:type 值放入数据集

通过 XML 架构定义 (XSD) 语言验证 XML 文档时,不会将 xsi:type 值放入数据集中。 但是,通过将 XML 格式化文件加载到 XML 文档(例如,myDoc),可以将 xsi:type 信息放入数据集中,如以下代码片段所示:

...;
myDoc.LoadXml(xmlFormat);
XmlNodeList ColumnList = myDoc.GetElementsByTagName("COLUMN");
for (int i = 0; i < ColumnList.Count; i++)
{
    Console.Write($"COLUMN: xsi:type={ColumnList[i].Attributes["type",
        "http://www.w3.org/2001/XMLSchema-instance"].Value}\n");
}

XML 格式化文件示例

本部分包含有关在不同情况下使用 XML 格式化文件的信息,包括 Adventure Works 示例。

注意

在下列示例所示的数据文件中,<tab> 表示数据文件中的制表符,<return> 表示回车符。

这些示例说明了使用 XML 格式化文件的各个主要方面,如下所述:

有关如何创建格式化文件的信息,请参阅创建格式化文件 (SQL Server)

A. 对字符数据字段和表列进行相同的排序

下面的示例显示了一个 XML 格式化文件,该文件描述一个包含三个字符数据字段的数据文件。 格式化文件将数据文件映射到包含三列的表中。 数据字段与表中的列一一对应。

  • 表(行):Person (Age INT, FirstName VARCHAR(20), LastName VARCHAR(30))
  • 数据文件(记录):Age<tab>FirstName<tab>LastName<return>

以下 XML 格式文件将数据从数据文件读取到表中。

<RECORD> 元素中,格式化文件将所有三个字段中的数据值表示为字符数据。 对于每个字段, TERMINATOR 属性指示位于数据值后面的终止符。

数据字段与表中的列一一对应。 在 <ROW> 元素中,格式化文件将 Age 列映射到第一个字段,将 FirstName 列映射到第二个字段,将 LastName 列映射到第三个字段。

<?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="\t"
            MAX_LENGTH="12" />
        <FIELD ID="2" xsi:type="CharTerm" TERMINATOR="\t"
            MAX_LENGTH="20" COLLATION="SQL_Latin1_General_CP1_CI_AS" />
        <FIELD ID="3" xsi:type="CharTerm" TERMINATOR="\r\n"
            MAX_LENGTH="30"
            COLLATION="SQL_Latin1_General_CP1_CI_AS" />
    </RECORD>
    <ROW>
        <COLUMN SOURCE="1" NAME="age" xsi:type="SQLINT" />
        <COLUMN SOURCE="2" NAME="firstname" xsi:type="SQLVARYCHAR" />
        <COLUMN SOURCE="3" NAME="lastname" xsi:type="SQLVARYCHAR" />
    </ROW>
</BCPFORMAT>

注意

有关等效的 AdventureWorks2022 示例,请参阅创建格式化文件 (SQL Server)

B. 对数据字段和表列进行不同的排序

下面的示例显示了一个 XML 格式化文件,该文件描述一个包含三个字符数据字段的数据文件。 格式化文件将数据文件映射到包含三列(与数据文件的字段排序方式不同)的表中。

  • 表(行):Person (Age INT, FirstName VARCHAR(20), LastName VARCHAR(30))
  • 数据文件(记录):Age<tab>FirstName<tab>LastName<return>

<RECORD> 元素中,格式化文件将所有三个字段中的数据值表示为字符数据。

<ROW> 元素中,格式化文件将 Age 列映射到第一个字段,将 FirstName 列映射到第三个字段,将 LastName 列映射到第二个字段。

<?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="\t"
            MAX_LENGTH="12" />
        <FIELD ID="2" xsi:type="CharTerm" TERMINATOR="\t" MAX_LENGTH="20"
            COLLATION="SQL_Latin1_General_CP1_CI_AS" />
        <FIELD ID="3" xsi:type="CharTerm" TERMINATOR="\r\n"
            MAX_LENGTH="30" COLLATION="SQL_Latin1_General_CP1_CI_AS" />
    </RECORD>
    <ROW>
        <COLUMN SOURCE="1" NAME="age" xsi:type="SQLINT" />
        <COLUMN SOURCE="3" NAME="firstname" xsi:type="SQLVARYCHAR" />
        <COLUMN SOURCE="2" NAME="lastname" xsi:type="SQLVARYCHAR" />
    </ROW>
</BCPFORMAT>

注意

有关等效的 AdventureWorks2022 示例,请参阅使用格式化文件将表列映射到数据文件字段 (SQL Server)

C. 省略数据字段

下面的示例显示了一个 XML 格式化文件,该文件描述一个包含四个字符数据字段的数据文件。 格式化文件将数据文件映射到包含三列的表中。 第二个数据字段不对应于任何表列。

  • 表(行):Person (Age INT, FirstName VARCHAR(20), LastName VARCHAR(30))
  • 数据文件(记录):Age<tab>FirstName<tab>LastName<return>

<RECORD> 元素中,格式化文件将所有四个字段中的数据值表示为字符数据。 对于每个字段, TERMINATOR 属性指示位于数据值后面的终止符。

<ROW> 元素中,格式化文件将 Age 列映射到第一个字段,将 FirstName 列映射到第三个字段,将 LastName 列映射到第四个字段。

<?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="\t"
            MAX_LENGTH="12" />
        <FIELD ID="2" xsi:type="CharTerm" TERMINATOR="\t"
            MAX_LENGTH="10"
            COLLATION="SQL_Latin1_General_CP1_CI_AS" />
        <FIELD ID="3" xsi:type="CharTerm" TERMINATOR="\t"
            MAX_LENGTH="20"
            COLLATION="SQL_Latin1_General_CP1_CI_AS" />
        <FIELD ID="4" xsi:type="CharTerm" TERMINATOR="\r\n"
            MAX_LENGTH="30"
            COLLATION="SQL_Latin1_General_CP1_CI_AS" />
    </RECORD>
    <ROW>
        <COLUMN SOURCE="1" NAME="age" xsi:type="SQLINT" />
        <COLUMN SOURCE="3" NAME="firstname" xsi:type="SQLVARYCHAR" />
        <COLUMN SOURCE="4" NAME="lastname" xsi:type="SQLVARYCHAR" />
    </ROW>
</BCPFORMAT>

注意

有关等效的 AdventureWorks2022 示例,请参阅使用格式化文件跳过数据字段 (SQL Server)

D. 将 <FIELD> xsi:type 映射到 <COLUMN> xsi:type

下面的示例显示了各种类型的字段及其与列的映射。

<?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 xsi:type="CharTerm" ID="C1" TERMINATOR="\t"
            MAX_LENGTH="4" />
        <FIELD xsi:type="CharFixed" ID="C2" LENGTH="10"
            COLLATION="SQL_LATIN1_GENERAL_CP1_CI_AS" />
        <FIELD xsi:type="CharPrefix" ID="C3" PREFIX_LENGTH="2"
            MAX_LENGTH="32" COLLATION="SQL_LATIN1_GENERAL_CP1_CI_AS" />
        <FIELD xsi:type="NCharTerm" ID="C4" TERMINATOR="\t"
            MAX_LENGTH="4" />
        <FIELD xsi:type="NCharFixed" ID="C5" LENGTH="10"
            COLLATION="SQL_LATIN1_GENERAL_CP1_CI_AS" />
        <FIELD xsi:type="NCharPrefix" ID="C6" PREFIX_LENGTH="2"
            MAX_LENGTH="32" COLLATION="SQL_LATIN1_GENERAL_CP1_CI_AS" />
        <FIELD xsi:type="NativeFixed" ID="C7" LENGTH="4" />
    </RECORD>
    <ROW>
        <COLUMN SOURCE="C1" NAME="Age" xsi:type="SQLTINYINT" />
        <COLUMN SOURCE="C2" NAME="FirstName" xsi:type="SQLVARYCHAR"
            LENGTH="16" NULLABLE="NO" />
        <COLUMN SOURCE="C3" NAME="LastName" />
        <COLUMN SOURCE="C4" NAME="Salary" xsi:type="SQLMONEY" />
        <COLUMN SOURCE="C5" NAME="Picture" xsi:type="SQLIMAGE" />
        <COLUMN SOURCE="C6" NAME="Bio" xsi:type="SQLTEXT" />
        <COLUMN SOURCE="C7" NAME="Interest" xsi:type="SQLDECIMAL"
            PRECISION="5" SCALE="3" />
    </ROW>
</BCPFORMAT>

E. 将 XML 数据映射到表

下面的示例创建了一个空的两列表 (t_xml),表中的第一列映射到 int 数据类型,第二列映射到 xml 数据类型。

CREATE TABLE t_xml (c1 INT, c2 XML);

以下 XML 格式化文件将数据文件加载到表 t_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="NativePrefix" PREFIX_LENGTH="1" />
        <FIELD ID="2" xsi:type="NCharPrefix" PREFIX_LENGTH="8" />
    </RECORD>
    <ROW>
        <COLUMN SOURCE="1" NAME="c1" xsi:type="SQLINT" />
        <COLUMN SOURCE="2" NAME="c2" xsi:type="SQLNCHAR" />
    </ROW>
</BCPFORMAT>

F. 导入固定长度或固定宽度的字段

下面的示例分别介绍包含 10 个或 6 个字符的固定字段。 格式化文件将这些字段的长度/宽度分别表示为 LENGTH="10"LENGTH="6"。 数据文件中的每行都以回车符-换行符组合 <CR><LF> 结束,格式化文件将这表示为 TERMINATOR="\r\n"

<?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="CharFixed" LENGTH="10" />
        <FIELD ID="2" xsi:type="CharFixed" LENGTH="6" />
        <FIELD ID="3" xsi:type="CharTerm" TERMINATOR="\r\n" />
    </RECORD>
    <ROW>
        <COLUMN SOURCE="1" NAME="C1" xsi:type="SQLINT" />
        <COLUMN SOURCE="2" NAME="C2" xsi:type="SQLINT" />
    </ROW>
</BCPFORMAT>

其他示例

有关非 XML 格式化文件和 XML 格式化文件的更多示例,请参阅以下文章: