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;
В. Укажите универсальный код ресурса (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"/>';