Udostępnij za pomocą


sp_xml_preparedocument (Transact-SQL)

Dotyczy do:SQL ServerAzure SQL DatabaseBaza danych SQL w Microsoft Fabric

Odczytuje tekst XML jako wejście, analizuje go za pomocą parsera MSXML (msxmlsql.dll), i udostępnia parsowany dokument w stanie gotowym do konsumpcji. Ten dokument parsowany to drzewo reprezentujące różne węzły w dokumencie XML: elementy, atrybuty, tekst, komentarze i tak dalej.

sp_xml_preparedocument zwraca uchwyt, który może być użyty do dostępu do nowo utworzonej wewnętrznej reprezentacji dokumentu XML. Ten uchwyt jest ważny podczas sesji lub do momentu jego unieważnienia przez wykonanie sp_xml_removedocument.

Dokument parsowany jest przechowywany w wewnętrznej pamięci podręcznej SQL Server. Parser MSXML może wykorzystać jedną ósmą całkowitej pamięci dostępnej dla SQL Server. Aby uniknąć wyczerpania pamięci, uruchom sp_xml_removedocument ją, aby zwolnić ją, gdy dokument przestanie być potrzebny. W wielu przypadkach metoda nodes() może być lepszą alternatywą i pomóc uniknąć nadmiernego użycia pamięci.

Dla kompatybilności wstecznej, znaki CR (char(13)) i LF (char(10)) są zwijane w atrybutach, sp_xml_preparedocument nawet jeśli są one entitizowane.

Uwaga / Notatka

Parser XML wywołany przez może sp_xml_preparedocument analizować wewnętrzne DTD i deklaracje encji. Ponieważ złośliwie skonstruowane DTD i deklaracje encji mogą być użyte do przeprowadzenia ataku typu denial of service, zdecydowanie zalecamy, aby użytkownicy nie przekazywali bezpośrednio dokumentów XML z niezaufanych źródeł do sp_xml_preparedocument.

Aby ograniczyć ataki rekurencyjne na rozszerzenie encji, ogranicza się do 10 000 liczby podmiotów, sp_xml_preparedocument które można rozwinąć pod jedną jednostką na najwyższym poziomie dokumentu. Limit nie dotyczy znaków ani liczb. To ograniczenie pozwala na przechowywanie dokumentów zawierających wiele referencji do encji, ale zapobiega rekurencyjnemu rozszerzaniu jednej jednostki w łańcuchu dłuższym niż 10 000 rozwinień.

sp_xml_preparedocument ogranicza liczbę elementów otwartych jednocześnie do 256.

Transact-SQL konwencje składni

Składnia

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

Arguments

Ważne

Argumenty dla rozszerzonych procedur składowanych należy wprowadzić w określonej kolejności zgodnie z opisem w sekcji składni. Jeśli parametry są wprowadzane poza kolejnością, wystąpi komunikat o błędzie.

hdoc

Uchwyt nowo utworzonego dokumentu. HDRoc to liczba całkowita.

[ xmltext ]

Oryginalny dokument XML. Parser MSXML analizuje ten dokument XML. xmltext to parametr tekstowy: char, nchar, varchar, nvarchar, text, ntext lub xml. Domyślna wartość to NULL, w takim przypadku tworzona jest wewnętrzna reprezentacja pustego dokumentu XML.

Uwaga / Notatka

sp_xml_preparedocument może przetwarzać tylko tekst lub nietypowane XML. Jeśli wartość instancji przeznaczona jako wejście jest już wpisana w XML, najpierw przerzuć ją do nowej nietypowanej instancji XML lub jako ciąg znaków, a następnie przekazać tę wartość jako wejście. Więcej informacji można znaleźć w artykule Porównaj typowany XML z nietypowanym XML.

[ xpath_namespaces ]

Określa deklaracje przestrzeni nazw używane w wyrażeniach XPath w wierszu i kolumnie w OPENXML. xpath_namespaces jest parametrem tekstowym: char, nchar, varchar, nvarchar, text, ntext lub xml.

Domyślna wartość to <root xmlns:mp="urn:schemas-microsoft-com:xml-metaprop">. xpath_namespaces udostępnia URI w przestrzeni nazw dla prefiksów używanych w wyrażeniach XPath w OPENXML, wraz z dobrze uformowanym dokumentem XML. xpath_namespaces deklaruje prefiks, który musi być użyty do odniesienia do przestrzeni urn:schemas-microsoft-com:xml-metapropnazw ; dostarcza to metadanych o parsowanych elementach XML. Chociaż można na nowo zdefiniować prefiks przestrzeni nazw dla przestrzeni nazw metawłasności, stosując tę technikę, ta przestrzeń nie zostaje utracona. Prefiks mp jest nadal ważny dla nawet urn:schemas-microsoft-com:xml-metaprop jeśli xpath_namespaces nie zawiera takiej deklaracji.

Zwracanie wartości kodu

0 (powodzenie) lub > 0 (niepowodzenie).

Permissions

Wymaga członkostwa w publicznej roli .

Przykłady

A. Przygotuj wewnętrzną reprezentację dla dobrze skonstruowanego dokumentu XML

Poniższy przykład zwraca uchwyt do nowo utworzonej wewnętrznej reprezentacji dokumentu XML, która jest dostarczana jako wejście. W wywołaniu do sp_xml_preparedocument, stosuje się domyślne mapowanie prefiksu przestrzeni nazw.

DECLARE @hdoc AS INT;
DECLARE @doc AS 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.
EXECUTE sp_xml_preparedocument
    @hdoc OUTPUT,
    @doc;

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

B. Przygotuj wewnętrzną reprezentację dla dobrze skonstruowanego dokumentu XML z DTD

Poniższy przykład zwraca uchwyt do nowo utworzonej wewnętrznej reprezentacji dokumentu XML, która jest dostarczana jako wejście. Procedura przechowywana waliduje dokument załadowany względem DTD zawartego w dokumencie. W wywołaniu do sp_xml_preparedocument, stosuje się domyślne mapowanie prefiksu przestrzeni nazw.

DECLARE @hdoc AS INT;
DECLARE @doc AS 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>';

EXECUTE sp_xml_preparedocument
    @hdoc OUTPUT,
    @doc;

C. Określ URI w przestrzeni nazw

Poniższy przykład zwraca uchwyt do nowo utworzonej wewnętrznej reprezentacji dokumentu XML, która jest dostarczana jako wejście. Wywołanie do sp_xml_preparedocument zachowuje mp prefiks do metawłasności mapowania przestrzeni nazw i dodaje prefiks xyz odwzorowujący do przestrzeni urn:MyNamespacenazw .

DECLARE @hdoc AS INT;
DECLARE @doc AS 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.
EXECUTE sp_xml_preparedocument
    @hdoc OUTPUT,
    @doc, '<ROOT xmlns:xyz="urn:MyNamespace"/>';