sp_xml_preparedocument (Transact-SQL)

适用于:SQL ServerAzure SQL 数据库

读取作为输入提供的 XML 文本,使用 MSXML 分析器msxmlsql.dll()分析文本,并提供处于可供使用的状态中分析的文档。 分析后的文档对 XML 文档中的各节点(元素、属性、文本和注释等)的树状表示形式。

sp_xml_preparedocument 返回一个句柄,该句柄可用于访问新创建的 XML 文档的内部表示形式。 此句柄在会话期间有效,或者直到执行 sp_xml_removedocument句柄失效为止。

分析的文档存储在 SQL Server 的内部缓存中。 MSXML 分析程序可以使用可用于 SQL Server 的总内存的八分之一。 为了避免内存不足,请在不再需要文档后立即运行 sp_xml_removedocument 以释放内存。 在许多情况下,nodes() 方法可能是更好的替代方法,有助于避免过多的内存使用。

为了向后兼容,即使这些字符被实体化, sp_xml_preparedocument 也会折叠属性中的 CR (char(13)) 和 LF (char(10)) 字符。

注意

通过调用 sp_xml_preparedocument 的 XML 分析程序可以分析内部 DTD 和实体声明。 由于恶意构造的 DTD 和实体声明可用于执行拒绝服务攻击,因此强烈建议用户不直接从不受信任的源传递 XML 文档。sp_xml_preparedocument

为了缓解递归实体扩展攻击, sp_xml_preparedocument 限制为 10,000 个可在文档顶层的单个实体下展开的实体数。 该限制不适用于字符或数字实体。 通过该限制,可以存储带有多个实体引用的文档,同时可以禁止在长于 10,000 个扩展的链中递归扩展任意实体。

sp_xml_preparedocument 将一次可打开的元素数限制为 256。

Transact-SQL 语法约定

语法

sp_xml_preparedocument hdoc OUTPUT
    [ , xmltext ]
    [ , xpath_namespaces ]
[ ; ]

参数

hdoc

新建文档的句柄。 hdoc 是一个整数。

[ xmltext ]

原始 XML 文档。 MSXML 分析器分析该 XML 文档。 xmltext 是文本参数: charncharvarcharnvarchartextntextxml。 默认值为 NULL,在此情况下将创建一个空 XML 文档的内部表示形式。

注意

sp_xml_preparedocument 只能处理文本或非类型化的 XML。 如果将作为输入的实例值已经是类型化的 XML,首先将它转换为新的非类型化的 XML 实例,或者转换为一个字符串,然后传递该值作为输入。 有关详细信息,请参阅 类型化的 XML 与非类型化的 XML 的比较

[ xpath_namespaces ]

指定在 OPENXML 的行和列 XPath 表达式中使用的命名空间声明。 xpath_namespaces是文本参数:charncharvarchar、nvarchartextntextxml

默认值为 <root xmlns:mp="urn:schemas-microsoft-com:xml-metaprop"> xpath_namespaces为 OPENXML 中 XPath 表达式中使用的前缀提供命名空间 URI,并提供格式正确的 XML 文档。 xpath_namespaces声明必须用于引用命名空间urn:schemas-microsoft-com:xml-metaprop的前缀;这提供了有关已分析的 XML 元素的元数据。 尽管可以使用此方法重新定义元属性命名空间的命名空间前缀,但不会丢失此命名空间。 即使xpath_namespaces不包含此类声明,前缀mp仍然有效urn:schemas-microsoft-com:xml-metaprop

返回代码值

0(成功)或 > 0(失败)。

权限

要求 公共 角色具有成员身份。

示例

A. 为格式正确的 XML 文档准备内部表示形式

以下示例返回作为输入提供的 XML 文档的新建内部表示形式的句柄。 在对 sp_xml_preparedocument 的调用中,将使用默认的命名空间前缀映射。

DECLARE @hdoc INT;
DECLARE @doc VARCHAR(1000);

SET @doc = '
<ROOT>
<Customer CustomerID="VINET" ContactName="Paul Henriot">
   <Order CustomerID="VINET" EmployeeID="5" OrderDate="1996-07-04T00:00:00">
      <OrderDetail OrderID="10248" ProductID="11" Quantity="12"/>
      <OrderDetail OrderID="10248" ProductID="42" Quantity="10"/>
   </Order>
</Customer>
<Customer CustomerID="LILAS" ContactName="Carlos Gonzlez">
   <Order CustomerID="LILAS" EmployeeID="3" OrderDate="1996-08-16T00:00:00">
      <OrderDetail OrderID="10283" ProductID="72" Quantity="3"/>
   </Order>
</Customer>
</ROOT>';

--Create an internal representation of the XML document.
EXEC sp_xml_preparedocument @hdoc OUTPUT, @doc;

-- Remove the internal representation.
EXEC sp_xml_removedocument @hdoc;

B. 使用 DTD 为格式正确的 XML 文档准备内部表示形式

以下示例返回作为输入提供的 XML 文档的新建内部表示形式的句柄。 存储过程根据文档中包含的 DTD 来验证装载的文档。 在对 sp_xml_preparedocument 的调用中,将使用默认的命名空间前缀映射。

DECLARE @hdoc int;
DECLARE @doc varchar(2000);
SET @doc = '
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE root
[<!ELEMENT root (Customers)*>
<!ELEMENT Customers EMPTY>
<!ATTLIST Customers CustomerID CDATA #IMPLIED ContactName CDATA #IMPLIED>]>
<root>
<Customers CustomerID="ALFKI" ContactName="Maria Anders"/>
</root>';

EXEC sp_xml_preparedocument @hdoc OUTPUT, @doc;

°C 指定命名空间 URI

以下示例返回作为输入提供的 XML 文档的新建内部表示形式的句柄。 调用将 sp_xml_preparedocument 前缀保留 mp 到元属性命名空间映射,并将 xyz 映射前缀添加到命名空间 urn:MyNamespace

DECLARE @hdoc int;
DECLARE @doc varchar(1000);
SET @doc ='
<ROOT>
<Customer CustomerID="VINET" ContactName="Paul Henriot">
   <Order CustomerID="VINET" EmployeeID="5"
           OrderDate="1996-07-04T00:00:00">
      <OrderDetail OrderID="10248" ProductID="11" Quantity="12"/>
      <OrderDetail OrderID="10248" ProductID="42" Quantity="10"/>
   </Order>
</Customer>
<Customer CustomerID="LILAS" ContactName="Carlos Gonzlez">
   <Order CustomerID="LILAS" EmployeeID="3"
           OrderDate="1996-08-16T00:00:00">
      <OrderDetail OrderID="10283" ProductID="72" Quantity="3"/>
   </Order>
</Customer>
</ROOT>'
--Create an internal representation of the XML document.
EXEC sp_xml_preparedocument @hdoc OUTPUT, @doc, '<ROOT xmlns:xyz="urn:MyNamespace"/>';