Megosztás a következőn keresztül:


sp_xml_preparedocument (Transact-SQL)

A következőkre vonatkozik:SQL ServerAzure SQL Database

Beolvassa a bemenetként megadott XML-szöveget, elemzi a szöveget az MSXML-elemzővel (msxmlsql.dll), és használatra kész állapotban biztosítja az elemzést. Ez az elemzett dokumentum az XML-dokumentum különböző csomópontjainak faábrázolása: elemek, attribútumok, szöveg, megjegyzések stb.

sp_xml_preparedocument egy leírót ad vissza, amely az XML-dokumentum újonnan létrehozott belső megjelenítésének eléréséhez használható. Ez a leíró a munkamenet során érvényes, vagy amíg a leírót nem érvényteleníti a sp_xml_removedocumentvégrehajtásával.

Az elemzett dokumentumokat az SQL Server belső gyorsítótárában tárolja a rendszer. Az MSXML-elemző az SQL Serverhez rendelkezésre álló teljes memória egynyolcadát használhatja. A memória elfogyásának elkerülése érdekében futtassa a sp_xml_removedocument a memória felszabadításához, amint már nincs szükség a dokumentumra. Sok esetben a csomópontok() módszer jobb alternatíva lehet, és segíthet elkerülni a túlzott memóriahasználatot.

A visszamenőleges kompatibilitás érdekében sp_xml_preparedocument összecsukja a CR (char(13)) és az LF (char(10)) karaktereket az attribútumokban még akkor is, ha ezek a karakterek entitások.

Jegyzet

A sp_xml_preparedocument által meghívott XML-elemző elemezheti a belső DTD-ket és entitásdeklarációkat. Mivel a rosszindulatúan létrehozott DTD-k és entitásdeklarációk szolgáltatásmegtagadásos támadás végrehajtására használhatók, javasoljuk, hogy a felhasználók ne adják át közvetlenül az XML-dokumentumokat nem megbízható forrásokból sp_xml_preparedocument.

A rekurzív entitásbővítési támadások mérséklése érdekében sp_xml_preparedocument 10 000-re korlátozza a dokumentum legfelső szintjén lévő egyetlen entitás alatt kibontható entitások számát. A korlát nem vonatkozik a karakter- vagy numerikus entitásokra. Ez a korlát lehetővé teszi a sok entitáshivatkozással rendelkező dokumentumok tárolását, de megakadályozza, hogy egy entitás rekurzívan ki legyen bontva egy 10 000-nél hosszabb láncban.

sp_xml_preparedocument az egyszerre megnyitható elemek számát 256-ra korlátozza.

Transact-SQL szintaxis konvenciói

Szintaxis

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

Érvek

Fontos

A kiterjesztett tárolt eljárások argumentumait a Szintaxis szakaszban leírt sorrendben kell megadni. Ha a paraméterek sorrenden kívül vannak beírva, hibaüzenet jelenik meg.

hdoc

Az újonnan létrehozott dokumentum leírója. hdoc egész szám.

[ xmltext ]

Az eredeti XML-dokumentum. Az MSXML-elemző elemzi ezt az XML-dokumentumot. xmltext szöveges paraméter: karakter, nchar, varchar, nvarchar, szöveg, ntext vagy xml. Az alapértelmezett érték NULL, amely esetben egy üres XML-dokumentum belső ábrázolása jön létre.

Jegyzet

sp_xml_preparedocument csak szöveget vagy nem beírt XML-t dolgozhat fel. Ha a bemenetként használandó példányérték már be van adva XML-fájlként, először egy új, nem beírt XML-példányra vagy sztringre öntötte, majd adja át ezt az értéket bemenetként. További információ: A beírt XML összehasonlítása a nem beírt XML-.

[ xpath_namespaces ]

Megadja az OPENXML sor- és oszlopbeli XPath-kifejezésekben használt névtérdeklarációkat. xpath_namespaces szöveges paraméter: karakter, nchar, varchar, nvarchar, szöveges, ntext vagy xml.

Az alapértelmezett érték a <root xmlns:mp="urn:schemas-microsoft-com:xml-metaprop">. xpath_namespaces egy jól formázott XML-dokumentummal biztosítja az OPENXML XPath-kifejezéseiben használt előtagok névtér-URI-jait. xpath_namespaces deklarálja az előtagot, amelyet a névtér urn:schemas-microsoft-com:xml-metaprop; ez metaadatokat biztosít az elemezt XML-elemekről. Bár ezzel a technikával újradefinitálhatja a metaproperty névtér névterének előtagját, ez a névtér nem vesz el. A mp előtag akkor is érvényes urn:schemas-microsoft-com:xml-metaprop, ha xpath_namespaces nem tartalmaz ilyen deklarációt.

Kódértékek visszaadása

0 (sikeres) vagy > 0 (hiba).

Engedélyek

A nyilvános szerepkör tagságát igényli.

Példák

Egy. Belső reprezentáció előkészítése egy jól formázott XML-dokumentumhoz

Az alábbi példa egy leírót ad vissza a bemenetként megadott XML-dokumentum újonnan létrehozott belső reprezentációjának. A sp_xml_preparedocumenthívásában a rendszer egy alapértelmezett névtér-előtag-leképezést használ.

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. Belső reprezentáció előkészítése egy jól formázott XML-dokumentumhoz DTD-vel

Az alábbi példa egy leírót ad vissza a bemenetként megadott XML-dokumentum újonnan létrehozott belső reprezentációjának. A tárolt eljárás ellenőrzi a dokumentumba foglalt DTD-be betöltött dokumentumot. A sp_xml_preparedocumenthívásában a rendszer egy alapértelmezett névtér-előtag-leképezést használ.

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. Névtér URI-nevének megadása

Az alábbi példa egy leírót ad vissza a bemenetként megadott XML-dokumentum újonnan létrehozott belső reprezentációjának. A sp_xml_preparedocument hívás megőrzi a metaproperty névtérleképezés mp előtagját, és hozzáadja a xyz leképezési előtagot a névtér urn:MyNamespace.

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"/>';