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

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

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

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

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

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

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

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

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

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

注意

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

如果 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 接口。