Поделиться через


sp_xml_preparedocument (Transact-SQL)

Область применения: SQL Server База данных SQL Azure

Считывает XML-текст, предоставленный в качестве входных данных, анализирует текст с помощью средства синтаксического анализа MSXML (msxmlsql.dll) и предоставляет проанализированный документ в состоянии, готовом к использованию. Проанализированный документ является древовидным представлением различных узлов в XML-документе: элементов, атрибутов, текста, комментариев и т. д.

sp_xml_preparedocument возвращает дескриптор, который можно использовать для доступа к созданному внутреннему представлению XML-документа. Этот дескриптор действителен во время сеанса или до тех пор, пока дескриптор не будет недопустим путем выполнения sp_xml_removedocument.

Проанализированный документ хранится во внутреннем кэше SQL Server. Средство синтаксического анализа MSXML может использовать одну восьмую общую память, доступную для SQL Server. Чтобы избежать нехватки памяти, запустите sp_xml_removedocument , чтобы освободить память, как только документ больше не требуется. Во многих случаях метод nodes() может быть лучшей альтернативой, и помочь избежать чрезмерного использования памяти.

Для обратной совместимости свернут символы CR (char(13)) и LF (char(10)) в атрибутах, sp_xml_preparedocument даже если эти символы идентицируются.

Примечание.

Средство синтаксического анализа XML, вызываемое с помощью sp_xml_preparedocument функции синтаксического анализа, может анализировать внутренние 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 — это текстовый параметр: char, nchar, varchar, nvarchar, text, ntext или xml. Значение по умолчанию — NULLэто внутреннее представление пустого XML-документа.

Примечание.

sp_xml_preparedocument может обрабатывать только текст или нетипизированный XML. Если значение экземпляра, передающееся в качестве входного параметра, уже является типизированным XML, его сначала необходимо привести к новому нетипизированному экземпляру XML или к строке, после чего его можно передавать в качестве входного параметра. Дополнительные сведения см. в разделе "Сравнение типизированного XML- с нетипизированным XML".

[ xpath_namespaces ]

Указывает объявления пространств имен, которые используются в выражениях XPath строк и столбцов в OPENXML. xpath_namespaces — это текстовый параметр: char, nchar, varchar, nvarchar, text, ntext или xml.

Значение по умолчанию — <root xmlns:mp="urn:schemas-microsoft-com:xml-metaprop">. xpath_namespaces предоставляет URI пространства имен для префиксов, используемых в выражениях XPath в OPENXML, с хорошо сформированным XML-документом. xpath_namespaces объявляет префикс, который должен использоваться для ссылки на пространство urn:schemas-microsoft-com:xml-metapropимен; это предоставляет метаданные об проанализированных XML-элементах. Хотя префикс пространства имен для пространства имен метапропастерства можно переопределить с помощью этого метода, это пространство имен не будет потеряно. Префикс mp по-прежнему действителен urn:schemas-microsoft-com:xml-metaprop , даже если xpath_namespaces не содержит такого объявления.

Значения кода возврата

0 (успешно) или > 0 (сбой).

Разрешения

Необходимо быть членом роли public.

Примеры

А. Подготовка внутреннего представления для хорошо сформированного 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. Подготовка внутреннего представления для хорошо сформированного XML-документа с помощью DTD

В следующем примере возвращается дескриптор вновь созданного внутреннего представления 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"/>';