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

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

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

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

当 XML 大容量加载读取 <Customer> 元素时,它会为 Customer 表生成一条记录。 当它读取 </Customer> end 标记时,XML 大容量加载会将该记录插入到 SQL Server 表中。 同样,在读取 <Order> 元素时,XML 大容量加载会为 Ordertable 生成一条记录,然后在读取 </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 不能与 Transaction 属性设置为 FALSE 一起使用。 ConnectionObject 不支持非传输模式,因为无法在传入的会话上打开多个 IRowsetFastLoad 接口。