XML 格式化文件的架构语法
本节介绍 XML 格式化文件的语法。若要查看该语法与实际的 XML 格式化文件的对应关系,请参阅XML 格式化文件示例。本节还介绍大容量导入是如何使用 <ROW> 和 <COLUMN> 元素的以及如何将元素的 xsi:type 值放入数据集。
您可以在 bcp 命令、BULK INSERT 语句或 INSERT ... SELECT * FROM OPENROWSET(BULK...) 语句中使用 XML 格式化文件。
注意: |
---|
您可以修改格式化文件,以便从字段编号和/或顺序与表列的编号和/或顺序不同的数据文件进行大容量导入。有关详细信息,请参阅在大容量导入期间使用格式化文件将字段映射到列。 |
XML 架构的基本语法
此语法语句仅显示元素(<BCPFORMAT>、<RECORD>、<FIELD>、<ROW> 和 <COLUMN>)及其基本属性。
<BCPFORMAT...>
<RECORD>
<FIELD ID = "fieldID" xsi:type = "fieldType" [...]
/>
</RECORD>
<ROW>
<COLUMN SOURCE = "fieldID" NAME = "columnName" xsi:type = "columnType" [...]
/>
</ROW>
</BCPFORMAT>
注意: |
---|
对于其他与 <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_LENGTH 值 p 必须是下列值之一:1、2、4 或 8。 |
除非是 xsi:type 值所必需,否则可选。 |
MAX_LENGTH ="m" |
此属性为给定字段中可以存储的最大字节数。如果没有目标表,列的最大长度就是未知的。MAX_LENGTH 属性限定输出字符列的最大长度,从而限制为列值分配的存储空间。当在 SELECT FROM 子句中使用了 OPENROWSET 函数的 BULK 选项时,使用该属性将带来极大的方便。 m 值必须是正整数。默认情况下,char 列的最大长度为 8000 个字符,nchar 列的最大长度为 4000 个字符。 |
可选 |
COLLATION ="collationName" |
COLLATION 仅适用于字符字段。有关 SQL 排序规则名称的列表,请参阅 SQL 排序规则名称 (Transact-SQL)。 |
可选 |
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_LENGTH、COLLATION |
NCharPrefix |
PREFIX_LENGTH |
MAX_LENGTH、COLLATION |
CharTerm |
TERMINATOR |
MAX_LENGTH、COLLATION |
NCharTerm |
TERMINATOR |
MAX_LENGTH、COLLATION |
有关 Microsoft SQL Server 数据类型的详细信息,请参阅数据类型 (Transact-SQL)。
<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 的值决定了给定实例中需要下面哪个可选属性。
注意:
下表列出了 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 完全无关。但是,如果列不是 NULLABLE,而字段指定为 NULL(未指定任何值),将产生运行时错误。
可选(任何数据类型均可用)
<COLUMN> 元素的 Xsi:type 值
xsi:type 值是标识元素实例的数据类型的 XML 构造(用法同属性)。本节后面将介绍有关“在数据集中包含 xsi:type 值”的信息。
<COLUMN> 元素支持下列本机 SQL 数据类型:
类型类别 | <COLUMN> 数据类型 | 必需的 XML 属性 必选的 XML 属性 | 数据类型 必选的 XML 属性 |
---|---|---|---|
固定 |
SQLBIT、SQLTINYINT、SQLSMALLINT、SQLINT、SQLBIGINT、SQLFLT4、SQLFLT8、SQLDATETIME、SQLDATETIM4、SQLDATETIM8、SQLMONEY、SQLMONEY4、SQLVARIANT 和 SQLUNIQUEID |
无。 |
NULLABLE |
变量号 |
SQLDECIMAL 和 SQLNUMERIC |
无。 |
NULLABLE、PRECISION、SCALE |
LOB |
SQLIMAGE、CharLOB、SQLTEXT 和 SQLUDT |
无。 |
NULLABLE |
字符 LOB |
SQLNTEXT |
无。 |
NULLABLE |
二进制字符串 |
SQLBINARY 和 SQLVARYBIN |
无。 |
NULLABLE、LENGTH |
字符串 |
SQLCHAR、SQLVARYCHAR、SQLNCHAR 和 SQLNVARCHAR |
无。 |
NULLABLE、LENGTH |
重要提示: |
---|
若要大容量导出或导入 SQLXML 数据,请在格式文件中使用下列数据类型之一:SQLCHAR 或 SQLVARYCHAR(数据以客户端代码页或排序规则隐含的代码页的形式发送)、SQLNCHAR 或 SQLNVARCHAR(数据以 Unicode 的形式发送)或者 SQLBINARY 或 SQLVARYBIN(数据不经任何转换直接发送)。 |
有关 SQL Server 数据类型的详细信息,请参阅数据类型 (Transact-SQL)。
大容量导入如何使用 <ROW> 元素
<ROW> 元素是否影响大容量导入操作取决于操作的执行方式:
- bcp 命令
数据加载到目标表中之后,bcp 将忽略 <ROW> 组件。相反,bcp 将加载那些基于目标表的列类型的数据。 - T-SQL 语句(BULK INSERT 和 OPENROWSET 的大容量行集访问接口)
在将数据大容量地导入表中时,Transact-SQL 语句将使用 <ROW> 组件来生成输入行集。Transact-SQL 语句还将根据 <ROW> 下指定的列类型和目标表中的对应列,进行适当的类型转换。如果格式化文件和目标表中指定的列类型之间存在不匹配,还将进行额外的类型转换。与 bcp 相比,该转换可能引起 BULK INSERT 或 OPENROWSET 的大容量行集访问接口的行为出现某些差异(即失去精度)。
无需任何其他信息,仅利用 <ROW> 元素中的信息即可构造行。因此,您可以使用 SELECT 语句 (SELECT * FROM OPENROWSET(BULK datafile FORMATFILE=xmlformatfile) 来生成行集。注意: 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");
}