Delen via


sp_xml_preparedocument (Transact-SQL)

van toepassing op:SQL ServerAzure SQL Database-

Leest de XML-tekst die wordt geleverd als invoer, parseert de tekst met behulp van de MSXML-parser (msxmlsql.dll) en biedt het geparseerde document een status die gereed is voor gebruik. Dit geparseerde document is een structuurweergave van de verschillende knooppunten in het XML-document: elementen, kenmerken, tekst, opmerkingen enzovoort.

sp_xml_preparedocument retourneert een ingang die kan worden gebruikt voor toegang tot de zojuist gemaakte interne weergave van het XML-document. Deze ingang is geldig tijdens de sessie of totdat de ingang ongeldig is door sp_xml_removedocumentuit te voeren.

Een geparseerd document wordt opgeslagen in de interne cache van SQL Server. De MSXML-parser kan één achtste van het totale geheugen gebruiken dat beschikbaar is voor SQL Server. Als u wilt voorkomen dat er onvoldoende geheugen beschikbaar is, voert u sp_xml_removedocument uit om het geheugen vrij te maken zodra het document niet meer nodig is. In veel gevallen kan de methode nodes() een beter alternatief zijn en helpen om overmatig geheugengebruik te voorkomen.

Voor compatibiliteit met eerdere versies sp_xml_preparedocument worden de CR-tekens (char(13)) en LF (char(10)) in kenmerken samengevouwen, zelfs als deze tekens zijn getitiseerd.

Notitie

De XML-parser die door sp_xml_preparedocument wordt aangeroepen, kan interne DTD's en entiteitsdeclaraties parseren. Omdat DTD's en entiteitsdeclaraties met kwaadwillende bedoelingen kunnen worden gebruikt om een Denial of Service-aanval uit te voeren, raden we u ten zeerste aan dat gebruikers XML-documenten van niet-vertrouwde bronnen niet rechtstreeks doorgeven aan sp_xml_preparedocument.

Om recursieve entiteitsuitbreidingsaanvallen te beperken, sp_xml_preparedocument limieten tot 10.000 het aantal entiteiten dat kan worden uitgebreid onder één entiteit op het hoogste niveau van een document. De limiet is niet van toepassing op teken- of numerieke entiteiten. Met deze limiet kunnen documenten met veel entiteitsverwijzingen worden opgeslagen, maar voorkomt u dat één entiteit recursief wordt uitgebreid in een keten die langer is dan 10.000 uitbreidingen.

sp_xml_preparedocument beperkt het aantal elementen dat tegelijk kan worden geopend tot 256.

Transact-SQL syntaxisconventies

Syntaxis

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

Argumenten

Belangrijk

Argumenten voor uitgebreide opgeslagen procedures moeten worden ingevoerd in de specifieke volgorde, zoals beschreven in de sectie Syntaxis. Als de parameters niet in de volgorde zijn ingevoerd, treedt er een foutbericht op.

hdoc-

De ingang naar het zojuist gemaakte document. hdoc- is een geheel getal.

[ xmltext ]

Het oorspronkelijke XML-document. Met de MSXML-parser wordt dit XML-document geparseerd. xmltext- is een tekstparameter: teken, nchar, varchar, nvarchar, tekst, ntext of xml-. De standaardwaarde is NULL. In dat geval wordt een interne weergave van een leeg XML-document gemaakt.

Notitie

sp_xml_preparedocument kan alleen tekst of niet-getypte XML verwerken. Als een instantiewaarde die moet worden gebruikt als invoer al xml is getypt, moet u deze eerst casten naar een nieuw niet-getypt XML-exemplaar of als een tekenreeks en die waarde vervolgens doorgeven als invoer. Zie Type XML vergelijken met niet-getypte XML-voor meer informatie.

[ xpath_namespaces ]

Hiermee geeft u de naamruimtedeclaraties op die worden gebruikt in XPath-expressies voor rijen en kolommen in OPENXML. xpath_namespaces is een tekstparameter: char, nchar, varchar, nvarchar, tekst, ntext of xml-.

De standaardwaarde is <root xmlns:mp="urn:schemas-microsoft-com:xml-metaprop">. xpath_namespaces biedt de naamruimte-URI's voor de voorvoegsels die worden gebruikt in de XPath-expressies in OPENXML, met een goed opgemaakt XML-document. xpath_namespaces het voorvoegsel declareert dat moet worden gebruikt om te verwijzen naar de naamruimte urn:schemas-microsoft-com:xml-metaprop; dit biedt metagegevens over de geparseerde XML-elementen. Hoewel u het voorvoegsel van de naamruimte voor de metaproperty-naamruimte opnieuw kunt definiëren met behulp van deze techniek, gaat deze naamruimte niet verloren. Het voorvoegsel mp is nog steeds geldig voor urn:schemas-microsoft-com:xml-metaprop, zelfs als xpath_namespaces geen dergelijke verklaring bevat.

Codewaarden retourneren

0 (geslaagd) of > 0 (mislukt).

Machtigingen

Vereist lidmaatschap van de openbare rol.

Voorbeelden

Een. Een interne weergave voorbereiden voor een goed opgemaakt XML-document

In het volgende voorbeeld wordt een ingang geretourneerd naar de zojuist gemaakte interne weergave van het XML-document dat als invoer wordt opgegeven. In de aanroep naar sp_xml_preparedocumentwordt een standaardtoewijzing voor naamruimtevoorvoegsel gebruikt.

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. Een interne weergave voorbereiden voor een goed opgemaakt XML-document met een DTD

In het volgende voorbeeld wordt een ingang geretourneerd naar de zojuist gemaakte interne weergave van het XML-document dat als invoer wordt opgegeven. De opgeslagen procedure valideert het document dat is geladen op basis van de DTD die in het document is opgenomen. In de aanroep naar sp_xml_preparedocumentwordt een standaardtoewijzing voor naamruimtevoorvoegsel gebruikt.

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. Een naamruimte-URI opgeven

In het volgende voorbeeld wordt een ingang geretourneerd naar de zojuist gemaakte interne weergave van het XML-document dat als invoer wordt opgegeven. De aanroep van sp_xml_preparedocument behoudt het mp voorvoegsel voor de toewijzing van de metaproperty-naamruimte en voegt het xyz toewijzingsvoorvoegsel toe aan de naamruimte 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"/>';