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

适用于:SQL Server Azure SQL 数据库

XML 大容量加载是一个独立 COM 对象,可用于将半结构化 XML 数据加载到Microsoft SQL Server 表中。

可以使用 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 数据解释为流并读取它。 当实用工具读取数据时,它会标识数据库表(s),从 XML 数据源生成相应的记录,然后将记录(s)发送到 SQL Server 进行插入。

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

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

当 XML 大容量加载读取 <Customer> 元素时,它会为 Customertable 生成记录。 读取 </Customer> 结束标记时,XML 大容量加载会将该记录插入 SQL Server 中的表中。 同样,当它读取 <Order> 元素时,XML 大容量加载会生成 Ordertable 的记录,然后在读取 </Order> 结束标记时将该记录插入 SQL Server 表中。

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

XML 大容量加载可以以事务或非事务模式运行。 如果在非事务模式下进行大容量加载,则性能通常最佳:即事务属性设置为 FALSE,并且以下任一条件为 true:

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

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

非事务方法不能保证在大容量加载进程发生错误时回滚(但是可以进行部分回滚)。 非事务大容量加载适用于数据库为空的情况。 因此,如果发生错误,您可以清除数据库并重新启动 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 属性一起使用。 ConnectionObject 不支持非事务模式,因为不可能在传入会话上打开多个 IRowsetFastLoad 接口。