Delen via


OPENXML (Transact-SQL)

van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL-database in Microsoft Fabric

OPENXML biedt een rowset-weergave over een XML-document. Omdat OPENXML een rowset-provider is, OPENXML kan worden gebruikt in Transact-SQL statements waarin rowset-providers zoals een tabel, view of de OPENROWSET functie kunnen voorkomen.

Transact-SQL syntaxis-conventies

Syntaxis

OPENXML ( idoc int [ in ]
    , rowpattern nvarchar [ in ]
    , [ flags byte [ in ] ] )
[ WITH ( SchemaDeclaration | TableName ) ]

Arguments

idoc

De documenthandle van de interne representatie van een XML-document. De interne representatie van een XML-document wordt gemaakt door aan te roepen sp_xml_preparedocument.

Rijpatroon

Het XPath-patroon werd gebruikt om de knooppunten te identificeren die als rijen werden verwerkt. De knooppunten komen uit het XML-document waarvan de handle wordt doorgegeven in de idoc-parameter .

flags

Geeft de mapping aan die wordt gebruikt tussen de XML-gegevens en de relationele rijset, en hoe de overloopkolom wordt ingevuld. Flags is een optionele invoerparameter en kan een van de volgende waarden zijn.

Bytewaarde Description
0 Standaard is het mappen in attribute-centric .
1 Gebruik de attribute-centric mapping. Kan worden gecombineerd met XML_ELEMENTS. In dit geval wordt eerst de attribute-centric mapping toegepast. Vervolgens element-centric wordt mapping toegepast op alle resterende kolommen.
2 Gebruik de element-centric mapping. Kan worden gecombineerd met XML_ATTRIBUTES. In dit geval wordt eerst de element-centric mapping toegepast. Vervolgens attribute-centric wordt mapping toegepast op alle resterende kolommen.
8 Kan gecombineerd worden (logisch OF) met XML_ATTRIBUTES of XML_ELEMENTS. In de context van ophalen geeft deze vlag aan dat de verbruikte data niet naar de overflow-eigenschap @mp:xmltextmag worden gekopieerd.

SchemaVerklaring

Een schemadefinitie van de vorm: ColNameColType [ ColPattern | MetaProperty ] [ , ColNameColType [ ColPattern | MetaProperty ] ... ]

  • ColName

    De kolomnaam in de rijset.

  • ColType

    Het SQL Server-datatype van de kolom in de rijset. Als de kolomtypen verschillen van het onderliggende xml-datatype van het attribuut, treedt type-coercion op.

  • ColPattern

    Een optioneel, algemeen XPath-patroon dat beschrijft hoe de XML-nodes aan de kolommen gekoppeld moeten worden. Als ColPattern niet is gespecificeerd, vindt de standaardmapping (attribute-centric of element-centric mapping zoals gespecificeerd door flags) plaats.

    Het XPath-patroon gespecificeerd als ColPattern wordt gebruikt om de speciale aard van de mapping (voor attribute-centric en element-centric mapping) aan te geven die de standaardmapping overschrijft of verbetert, zoals aangegeven door vlaggen.

    Het algemene XPath-patroon dat als ColPattern is gespecificeerd, ondersteunt ook de meta-eigenschappen.

  • MetaProperty

    Een van de metaeigenschappen die door OPENXML. worden geleverd. Als MetaProperty is gespecificeerd, bevat de kolom informatie die door de metaproperty wordt verstrekt. De metaeigenschappen stellen je in staat informatie (zoals relatieve positie en naamruimte-informatie) over XML-knooppunten te extraheren. Deze metaeigenschappen leveren meer informatie dan zichtbaar is in de tekstuele representatie.

TableName

De tabelnaam die gegeven kan worden (in plaats van SchemaDeclaratie), als er al een tabel met het gewenste schema bestaat en er geen kolompatronen nodig zijn.

Opmerkingen

De WITH clausule biedt een rijsetformaat (en aanvullende mapping-informatie indien nodig) door gebruik te maken van SchemaDeclaration of door een bestaande TableName te specificeren. Als de optionele WITH clausule niet is gespecificeerd, worden de resultaten teruggegeven in een randtabelformaat. Randtabellen vertegenwoordigen de fijnmazige XML-documentstructuur (zoals element-/attribuutnamen, de documenthiërarchie, de naamruimtes, PI's, enzovoort) in één tabel.

De volgende tabel beschrijft de structuur van de randtabel .

Kolomnaam Gegevenstype Description
id bigint De unieke ID van de documentknoop.

Het wortelelement heeft een ID-waarde 0. De negatieve id-waarden zijn gereserveerd.
parentid bigint Identificeert het bovenliggende element van het knooppunt. De ouder die door deze ID wordt geïdentificeerd is niet per se het ouderelement, maar het hangt af van de nodetype knoop waarvan de ouder met deze ID wordt geïdentificeerd. Als de knoop bijvoorbeeld een tekstknoop is, kan de ouder ervan een attribuutknoop zijn.

Als de node op het bovenste niveau in het XML-document staat, is NULLhet ParentID .
nodetype int Identificeert het knooppunttype. Deze waarde is een geheel getal dat overeenkomt met de XML DOM knooppunttypenummering. De knooptypes zijn:

1 = Elementknoop
2 = Attribuutknoop
3 = Tekstknoop
localname nvarchar Geeft de lokale naam van het element of kenmerk. NULL als het DOM-object geen naam heeft.
prefix nvarchar Het naamruimtevoorvoegsel van de knoopnaam.
namespaceuri nvarchar De naamruimte-URI van de node. Als de waarde is NULL, is er geen naamruimte aanwezig.
data type nvarchar Het daadwerkelijke datatype van de element of attribuutrij, anders is NULL. Het gegevenstype wordt afgeleid van de inline-DTD of van het inlineschema.
prev bigint De XML-ID van het vorige broer-element. NULL Als er geen directe vorige broer of zus is.
text ntext Bevat de attribuutwaarde of de elementinhoud in tekstvorm (of is als NULL de edge-tabel geen waarde vereist).

Voorbeelden

Eén. Gebruik een eenvoudige SELECT-instructie met OPENXML

Het volgende voorbeeld creëert een interne representatie van de XML-afbeelding door gebruik te maken van sp_xml_preparedocument. Een SELECT instructie die een OPENXML rowset-provider gebruikt, wordt vervolgens uitgevoerd tegen de interne representatie van het XML-document.

De vlagwaarde wordt gezet op 1. Deze waarde geeft mapping aan attribute-centric . Daarom worden de XML-attributen gekoppeld aan de kolommen in de rijset. Het rijpatroon dat als /ROOT/Customer wordt gespecificeerd, identificeert de <Customers> te verwerken knooppunten.

De optionele ColPattern (kolompatroon) parameter is niet gespecificeerd omdat de kolomnaam overeenkomt met de XML-attribuutnamen.

De OPENXML rowset-provider maakt een tweekolom-rijset (CustomerID en ContactName) waaruit de SELECT instructie de benodigde kolommen ophaalt (in dit geval alle kolommen).

DECLARE @idoc INT, @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 @idoc OUTPUT, @doc;

-- Execute a SELECT statement that uses the OPENXML rowset provider.
SELECT *
FROM OPENXML(@idoc, '/ROOT/Customer', 1) WITH (
    CustomerID VARCHAR(10),
    ContactName VARCHAR(20)
);

Hier is het resultatenoverzicht.

CustomerID ContactName
---------- --------------------
VINET      Paul Henriot
LILAS      Carlos Gonzlez

Als dezelfde SELECT instructie wordt uitgevoerd met vlaggen ingesteld op 2, wat mapping aangeeft element-centric , worden de waarden van CustomerID en ContactName voor beide klanten in het XML-document teruggegeven als NULL, omdat er geen elementen benoemd CustomerID of ContactName in het XML-document zijn.

Hier is het resultatenoverzicht.

CustomerID ContactName
---------- -----------
NULL       NULL
NULL       NULL

B. Specificeer ColPattern voor mapping tussen kolommen en de XML-attributen

De volgende query levert klant-ID, besteldatum, product-ID en hoeveelheidsattributen uit het XML-document. Het rijpatroon identificeert de <OrderDetails> elementen. ProductID en Quantity zijn de attributen van het <OrderDetails> element. Echter, OrderID, CustomerID, en zijn de attributen OrderDate van het ouderelement (<Orders>).

Het optionele ColPattern is gespecificeerd voor de volgende mappings:

  • De OrderID, CustomerID, en OrderDate in de rijset worden gekoppeld aan de attributen van de ouder van de knooppunten die door het rijpatroon in het XML-document zijn geïdentificeerd.

  • De ProdID kolom in de rijset wordt afgestemd op het ProductID attribuut, en de Qty kolom in de rijset op het Quantity attribuut van de knooppunten die in het rijpatroon zijn geïdentificeerd.

Hoewel de element-centric mapping wordt gespecificeerd door de flags-parameter , overschrijft de mapping die in ColPattern is gespecificeerd deze mapping.

DECLARE @idoc INT, @doc VARCHAR(1000);

SET @doc = '
<ROOT>
<Customer CustomerID="VINET" ContactName="Paul Henriot">
   <Order OrderID="10248" CustomerID="VINET" EmployeeID="5"
           OrderDate="1996-07-04T00:00:00">
      <OrderDetail ProductID="11" Quantity="12"/>
      <OrderDetail ProductID="42" Quantity="10"/>
   </Order>
</Customer>
<Customer CustomerID="LILAS" ContactName="Carlos Gonzlez">v
   <Order OrderID="10283" CustomerID="LILAS" EmployeeID="3"
           OrderDate="1996-08-16T00:00:00">
      <OrderDetail ProductID="72" Quantity="3"/>
   </Order>
</Customer>
</ROOT>';

--Create an internal representation of the XML document.
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc;

-- SELECT stmt using OPENXML rowset provider
SELECT *
FROM OPENXML(@idoc, '/ROOT/Customer/Order/OrderDetail', 2) WITH (
    OrderID INT '../@OrderID',
    CustomerID VARCHAR(10) '../@CustomerID',
    OrderDate DATETIME '../@OrderDate',
    ProdID INT '@ProductID',
    Qty INT '@Quantity'
);

Hier is het resultatenoverzicht.

OrderID CustomerID           OrderDate                 ProdID    Qty
------------------------------------------------------------------------
10248      VINET       1996-07-04 00:00:00.000   11      12
10248      VINET       1996-07-04 00:00:00.000   42      10
10283      LILAS       1996-08-16 00:00:00.000   72      3

C. Verkrijg resultaten in een randtabelformaat

Het voorbeeld XML-document in het volgende voorbeeld bestaat uit <Customers>, <Orders>, en <Order_0020_Details> elementen. Eerst sp_xml_preparedocument wordt aangeroepen om een documenthandle te verkrijgen. Deze documenthandle wordt doorgegeven aan OPENXML.

In de OPENXML instructie identificeert het rijpatroon (/ROOT/Customers) de <Customers> knooppunten die verwerkt moeten worden. Omdat de WITH clausule niet wordt geleverd, OPENXML retourneert de rijset in een randtabelformaat.

Ten slotte haalt de SELECT instructie alle kolommen in de randtabel op.

DECLARE @idoc INT, @doc VARCHAR(1000);

SET @doc = '
<ROOT>
<Customers CustomerID="VINET" ContactName="Paul Henriot">
   <Orders CustomerID="VINET" EmployeeID="5" OrderDate=
           "1996-07-04T00:00:00">
      <Order_x0020_Details OrderID="10248" ProductID="11" Quantity="12"/>
      <Order_x0020_Details OrderID="10248" ProductID="42" Quantity="10"/>
   </Orders>
</Customers>
<Customers CustomerID="LILAS" ContactName="Carlos Gonzlez">
   <Orders CustomerID="LILAS" EmployeeID="3" OrderDate=
           "1996-08-16T00:00:00">
      <Order_x0020_Details OrderID="10283" ProductID="72" Quantity="3"/>
   </Orders>
</Customers>
</ROOT>';

--Create an internal representation of the XML document.
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc;

-- SELECT statement that uses the OPENXML rowset provider.
SELECT * FROM OPENXML(@idoc, '/ROOT/Customers')

EXEC sp_xml_removedocument @idoc;