OPENXML (Transact-SQL)

Gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL-databas i Microsoft Fabric

OPENXML tillhandahåller en raduppsättningsvy över ett XML-dokument. Eftersom OPENXML är en radmängdsleverantör, OPENXML kan användas i Transact-SQL satser där radmängdsleverantörer såsom en tabell, vy eller funktionen OPENROWSET kan förekomma.

Transact-SQL syntaxkonventioner

Syntax

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

Arguments

idoc

Dokumenthandtaget för den interna representationen av ett XML-dokument. Den interna representationen av ett XML-dokument skapas genom att anropa sp_xml_preparedocument.

Rodmönster

XPath-mönstret användes för att identifiera noderna som skulle bearbetas som rader. Noderna kommer från XML-dokumentet vars handtag skickas i idoc-parametern .

flags

Anger mappningen som används mellan XML-data och relationsraduppsättningen, samt hur spill-over-kolumnen fylls. Flags är en valfri indataparameter och kan vara ett av följande värden.

Bytevärde Description
0 Standardinställningen är attribute-centric mappning.
1 Använd kartläggningen attribute-centric . Kan kombineras med XML_ELEMENTS. I detta fall tillämpas avbildningen attribute-centric först. Därefter element-centric tillämpas mappning för eventuella återstående kolumner.
2 Använd kartläggningen element-centric . Kan kombineras med XML_ATTRIBUTES. I detta fall tillämpas avbildningen element-centric först. Därefter attribute-centric tillämpas mappning för eventuella återstående kolumner.
8 Kan kombineras (logisk ELLER) med XML_ATTRIBUTES eller XML_ELEMENTS. I sammanhanget av hämtning indikerar denna flagga att den konsumerade datan inte ska kopieras till överflödesegenskapen @mp:xmltext.

SchemaDeklaration

En schemadefinition av formen: ColNameColType [ ColPattern | MetaProperty ] [ , ColNameColType [ ColPattern | MetaProperty ] ... ]

  • ColName

    Kolumnnamnet i raduppsättningen.

  • ColType

    SQL Server-datatypen för kolumnen i raduppsättningen. Om kolumntyperna skiljer sig från den underliggande xml-datatypen för attributet, sker typtvingning.

  • ColPattern

    Ett valfritt, allmänt XPath-mönster som beskriver hur XML-noderna ska mappas till kolumnerna. Om ColPattern inte är specificerat sker standardmappningen (attribute-centric eller element-centric mappningen enligt flaggor).

    XPath-mönstret som anges som ColPattern används för att specificera den speciella karaktären hos mappningen (för attribute-centric och element-centric mappningen) som skriver över eller förbättrar standardmappningen som flaggor angier.

    Det allmänna XPath-mönstret som anges som ColPattern stöder också metaegenskaperna.

  • MetaProperty

    En av metaegenskaperna som tillhandahålls av OPENXML. Om MetaEgenskap är specificerad innehåller kolumnen information som tillhandahålls av metaegenskapen. Metaegenskaperna gör det möjligt att extrahera information (såsom relativ position och namnrymdsinformation) om XML-noder. Dessa metaegenskaper ger mer information än vad som syns i den textuella representationen.

TableName

Tabellnamnet som kan ges (istället för SchemaDeklaration), om en tabell med önskat schema redan finns och inga kolumnmönster krävs.

Anmärkningar

Klausulen WITH tillhandahåller ett raduppsättningsformat (och ytterligare mappningsinformation vid behov) genom att använda antingen SchemaDeclaration eller genom att specificera ett befintligt TableName. Om den valfria WITH klausulen inte specificeras, returneras resultaten i ett kanttabellformat . Kanttabeller representerar den fina XML-dokumentstrukturen (såsom element-/attributnamn, dokumenthierarkin, namnrymden, PI:er och så vidare) i en enda tabell.

Följande tabell beskriver strukturen för kanttabellen .

Kolumnnamn Datatyp Description
id bigint Det unika ID:t för dokumentnoden.

Rotelementet har ett ID-värde 0. De negativa ID-värdena är reserverade.
parentid bigint Identifierar den överordnade noden. Föräldern som identifieras med detta ID är inte nödvändigtvis förälderelementet, men det beror på vilken nodetype nod vars förälder identifieras med detta ID. Till exempel, om noden är en textnod, kan föräldern till den vara en attributnod.

Om noden är på den högsta nivån i XML-dokumentet är NULLdess ParentID .
nodetype int Identifierar nodtypen. Detta värde är ett heltal som motsvarar XML DOM-nodtypnumreringen. Nodtyperna är:

1 = Elementnod
2 = Attributnod
3 = Textnod
localname nvarchar Ger det lokala namnet på elementet eller attributet. NULL om DOM-objektet inte har något namn.
prefix nvarchar Namnrymdsprefixet för nodens namn.
namespaceuri nvarchar Nodens namnrymds-URI. Om värdet är NULL, finns inget namnrymd närvarande.
data type nvarchar Den faktiska datatypen för element- eller attributraden, annars är NULL. Datatypen härleds från den infogade DTD:en eller från det infogade schemat.
prev bigint XML-ID:t för det föregående syskonelementet. NULL Om det inte finns något direkt tidigare syskon.
text ntext Innehåller attributvärdet eller elementinnehållet i textform (eller är NULL om kanttabellposten inte kräver något värde).

Examples

A. Använd en grundläggande SELECT-sats med OPENXML

Följande exempel skapar en intern representation av XML-bilden genom att använda sp_xml_preparedocument. En SELECT sats som använder en OPENXML rowset-provider körs sedan mot den interna representationen av XML-dokumentet.

Flaggvärdet sätts till 1. Detta värde indikerar attribute-centric avbildning. Därför mappas XML-attributen till kolumnerna i raduppsättningen. Radmönstret som anges som /ROOT/Customer identifierar de <Customers> noder som ska bearbetas.

Den valfria ColPattern (kolumnmönster) parametern specificeras inte eftersom kolumnnamnet matchar XML-attributnamnen.

Raduppsättningsleverantören OPENXML skapar en tvåkolumns radmängd (CustomerID och ContactName) från vilken satsen SELECT hämtar de nödvändiga kolumnerna (i detta fall alla kolumner).

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)
);

Här är resultatet.

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

Om samma SELECT sats körs med flaggor inställda på 2, vilket indikerar element-centric mappning, returneras värdena för CustomerID och ContactName för båda kunderna i XML-dokumentet som NULL, eftersom det inte finns några namn eller ContactName element CustomerID i XML-dokumentet.

Här är resultatet.

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

B. Specificera ColPattern för mappning mellan kolumner och XML-attributen

Följande fråga returnerar kund-ID, orderdatum, produkt-ID och kvantitetsattribut från XML-dokumentet. Radmönstret identifierar <OrderDetails> elementen. ProductID och Quantity är elementets <OrderDetails> attribut. Dock OrderIDär , CustomerID, och OrderDate attributen för föräldraelementet (<Orders>).

Det valfria ColPattern specificeras för följande mappningar:

  • , OrderIDCustomerID, och OrderDate i raduppsättningen mappas till attributen för föräldern till noderna som identifieras av radmönster i XML-dokumentet.

  • Kolumnen ProdID i raduppsättningen motsvarar attributet ProductID , och kolumnen Qty i raduppsättningen motsvarar Quantity attributet för noderna som identifierats i radmönstret.

Även om mappningen element-centric specificeras av flaggans parameter, skriver mappningen som anges i ColPattern över denna mappning.

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'
);

Här är resultatet.

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. Erhåll resultat i ett kanttabellformat

Exempeldokumentet för XML i följande exempel består av <Customers>, <Orders>, och <Order_0020_Details> element. Först sp_xml_preparedocument kallas för att erhålla ett dokumenthandtag. Detta dokumenthandtag skickas till OPENXML.

I satsen OPENXML identifierar radmönstret (/ROOT/Customers) de <Customers> noder som ska bearbetas. Eftersom klausulen WITH inte tillhandahålls, OPENXML returnerar raduppsättningen i ett kanttabellsformat .

Slutligen hämtar SELECT satsen alla kolumner i kanttabellen .

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;