XML 大容量加载简介 (SQLXML 4.0)

XML 大容量加载是使您可以将半结构化 XML 数据加载到 Microsoft SQL Server 表的独立 COM 对象。

您可以使用 INSERT 语句和 OPENXML 函数将 XML 数据插入到 SQL Server 数据库;但是,当需要插入大量 XML 数据时,大容量加载实用工具提供了更好的性能。

XML 大容量加载对象模型的 Execute 方法采用两个参数:

  • 带批注的 XML 架构定义 (XSD) 或 XML 数据精简 (XDR) 架构。XML 大容量加载实用工具解释此映射架构和在标识要插入 XML 数据的 SQL Server 表时在该架构中指定的批注。

  • XML 文档或文档片段(文档片段是没有单个顶级元素的文档)。可以指定 XML 大容量加载可读取的文件名或流。

XML 大容量加载解释此映射架构,并标识要插入 XML 数据的表。

本部分假定您熟悉以下 SQL Server 功能:

XML 数据流

由于源 XML 文档可能很大,因此无法将整个文档读入内存以进行大容量加载处理。XML 大容量加载而是将 XML 数据解释为流并读取它。当该实用工具读取数据时,该工具标识数据库表,并根据 XML 数据源生成相应记录,然后再将这些记录发送到 SQL Server 以便插入。

例如,以下源 XML 文档由 <Customer> 元素和 <Order> 子元素组成:

<Customer ...>
    <Order.../>
    <Order .../>
     ...
</Customer>
...

当 XML 大容量加载读取 <Customer> 元素时,将针对 Customer 表生成一条记录。当 XML 大容量加载读取 </Customer> 结束标记时,该工具将该记录插入到 SQL Server 中的表。同样,当读取 <Order> 元素时,XML 大容量加载针对 Order 表生成一条记录,并在读取 </Order> 结束标记时将该记录插入到 SQL Server 表。

事务和非事务 XML 大容量加载操作

XML 大容量加载可以以事务或非事务模式运行。如果以非事务模式进行大容量加载,性能通常可以达到最佳状态:也即,Transaction 属性设置为 FALSE,且满足以下任一条件:

  • 要向其大容量加载数据的表为空,且没有任何索引。

  • 表具有数据和唯一索引。

非事务方法不能保证在大容量加载进程发生错误时回滚(但是可以进行部分回滚)。非事务大容量加载适用于数据库为空的情况。因此,如果发生错误,您可以清除数据库并重新启动 XML 大容量加载。

注意注意

在非事务模式下,XML 大容量加载使用并提交默认的内部事务。当 Transaction 属性设置为 TRUE 时,XML 大容量加载不会对该事务调用提交。

如果 Transaction 属性设置为 TRUE,XML 大容量加载将为映射架构中标识的每个表创建一个临时文件。XML 大容量加载首先将源 XML 文档中的记录存储到这些临时文件中。接着,Transact-SQL BULK INSERT 语句检索这些文件中的上述记录,并将其存储到相应的表中。您可以使用 TempFilePath 属性指定这些临时文件的位置。您必须确保用于 XML 大容量加载的 SQL Server 帐户有权访问此路径。如果未指定 TempFilePath 属性,则使用在 TEMP 环境变量中指定的默认文件路径来创建临时文件。

如果 Transaction 属性设置为 FALSE(默认设置),XML 大容量加载则使用 OLE DB 接口 IRowsetFastLoad 来大容量加载数据。

如果 ConnectionString 属性设置了连接字符串,并且 Transaction 属性设置为 TRUE,XML 大容量加载则在其自己的事务上下文中运行。(例如,XML 大容量加载启动其自己的事务,并根据需要提交或回滚。)

如果 ConnectionCommand 属性使用现有连接对象设置连接,并且 Transaction 属性设置为 TRUE,XML 大容量加载不会在成功或失败时分别执行 COMMIT 或 ROLLBACK 语句。如果出现错误,XML 大容量加载则返回相应的错误消息。执行 COMMIT 或 ROLLBACK 语句由启动该大容量加载的客户端决定。用于 XML 大容量加载的连接对象应是 ICommand 类型或 ADO 命令对象。

在 SQLXML 4.0 中,不能将 ConnectionObject 与设置为 FALSE 的Transaction 属性一起使用。由于无法在一个传入会话中打开多个 IRowsetFastLoad 接口,因此,ConnectionObject 将不支持非事务模式。