sp_xml_preparedocument (Transact-SQL)
适用于: SQL Server Azure 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。
语法
sp_xml_preparedocument hdoc OUTPUT
[ , xmltext ]
[ , xpath_namespaces ]
[ ; ]
参数
hdoc
新建文档的句柄。 hdoc 是一个整数。
[ xmltext ]
原始 XML 文档。 MSXML 分析器分析该 XML 文档。 xmltext 是文本参数: char、 nchar、 varchar、 nvarchar、 text、 ntext 或 xml。 默认值为 NULL
,在这种情况下,将创建空 XML 文档的内部表示形式。
注意
sp_xml_preparedocument
只能处理文本或非类型化的 XML。 如果将作为输入的实例值已经是类型化的 XML,首先将它转换为新的非类型化的 XML 实例,或者转换为一个字符串,然后传递该值作为输入。 有关详细信息,请参阅类型化 XML 与非类型化 XML 比较。
[ xpath_namespaces ]
指定在 OPENXML 的行和列 XPath 表达式中使用的命名空间声明。 xpath_namespaces是文本参数:char、nchar、varchar、nvarchar、text、ntext 或 xml。
默认值为 <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"/>';