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


OPENXML (Transact-SQL)

A következőkre vonatkozik:SQL ServerAzure SQL DatabaseFelügyelt Azure SQL-példánySQL-adatbázis a Microsoft Fabricben

OPENXML sorhalmaz-nézetet biztosít egy XML dokumentum felett. Mivel OPENXML egy sorhalmaz-szolgáltató, OPENXML használható Transact-SQL állításokban, amelyekben sorhalmaz szolgáltatók, például tábla, nézet vagy a OPENROWSET függvény megjelenhetnek.

Transact-SQL szintaxis konvenciók

Szemantika

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

Arguments

IDOC

Az XML dokumentum belső reprezentációjának dokumentumkezelője. Az XML dokumentum belső reprezentációját úgy hozza létre, hogy meghívják sp_xml_preparedocument.

sormintázat

Az XPath minta a sorként feldolgozott csomópontok azonosítására szolgál. A csomópontok az XML dokumentumból származnak, amelynek kezelő oldala az idoc paraméterben van átadva.

flags

Jelzi az XML adatok és a relációs sorhalmaz közötti leképezést, valamint azt, hogyan töltik ki a túlterhelő oszlop. a flags opcionális bemeneti paraméter, és az alábbi értékek egyike lehet.

Bájtérték Description
0 Alapértelmezett a attribute-centric leképezés.
1 Használd a attribute-centric térképezést. Kombinálható a XML_ELEMENTS. Ebben az esetben először a attribute-centric leképezést alkalmazzuk. Ezután element-centric a leképezést alkalmazzuk a megmaradt oszlopokra.
2 Használd a element-centric térképezést. Kombinálható a XML_ATTRIBUTES. Ebben az esetben először a element-centric leképezést alkalmazzuk. Ezután attribute-centric a leképezést alkalmazzuk a megmaradt oszlopokra.
8 Kombinálható (logikus VAGY) vagy XML_ELEMENTS-valXML_ATTRIBUTES. A lekérdezés kontextusában ez a zászló azt jelzi, hogy a felhasznált adatokat nem szabad átmásolni a túlcsordulás tulajdonságra @mp:xmltext.

SémaNyilatkozat

Az alábbi forma sémadefiníciója: ColNameColType [ ColPattern | MetaProperty ] [ , ColNameColType [ ColPattern | MetaProperty ] ... ]

  • ColName

    Az oszlop neve a sorhalmazban.

  • ColType

    Az oszlop SQL Server adattípusa a sorhalmazban. Ha az oszloptípusok eltérnek az attribútum mögöttes xml adattípusától, típuskényszerítés következik be.

  • ColPattern

    Egy opcionális, általános XPath minta, amely leírja, hogyan kell az XML csomópontokat az oszlopokhoz leképezni. Ha a ColPattern nincs megadva, akkor az alapértelmezett leképezés (attribute-centric vagy element-centric a zászlók által meghatározott leképezés) történik.

    Az XPath mintázat, amelyet ColPatternként jelölnek, arra használják, hogy meghatározza a leképezés (és attribute-centricelement-centric a leképezés) különleges jellegét, amely felülírja vagy javítja a zászlókkal jelölt alapértelmezett leképezést.

    Az általános XPath minta, amelyet ColPatternként jelöltek, szintén támogatja a metajellemzőket.

  • MetaProperty

    Az egyik metatulajdonság, amelyet .OPENXML Ha a MetaProperty meg van jelölve, az oszlop tartalmazza a metaproperty által szolgáltatott információkat. A metatulajdonságok lehetővé teszik az XML csomópontokról származó információk (például relatív pozíció- és névtér információk) kinyerését. Ezek a metatulajdonságok több információt nyújtanak, mint amennyit a szöveges ábrázolás lát.

TáblaNév

A tábla neve, amely megadható (a SchemaDeclaration helyett), ha már létezik egy tábla a kívánt sémával, és nincs szükség oszlopmintákra.

Megjegyzések

A WITH záradék sorhalmaz-formátumot (és szükség esetén további leképezési információkat) biztosít a SchemaDeclaration használatával vagy egy meglévő TableName megadásával. Ha az opcionális WITH záradék nincs megadva, az eredmények edge table formátumban kerülnek vissza. Az edge táblák egyetlen táblában ábrázolják a finomszemcsés XML dokumentumstruktúrát (például elem/attribútumneveket, dokumentumhierarchiát, névtereket, PI-ket stb.) egyetlen táblában.

Az alábbi táblázat az edge tábla szerkezetét írja le.

Oszlop név Adattípus Description
id bigint A dokumentumcsomópont egyedi azonosítója.

A gyökérelemnek van azonosító értéke 0. A negatív azonosítók fenntartottak.
parentid bigint Azonosítja a csomópont szülőját. Az azonosítóval azonosított szülő nem feltétlenül az anyaelem, hanem attól függ nodetype , melyik csomópont van ezen azonosító ponton. Például, ha a csomópont szöveges csomópont, akkor annak az anyja lehet attribútumcsomópont.

Ha a csomópont az XML dokumentum legfelső szintjén van, akkor ParentID az NULL.
nodetype int Azonosítja a csomópont típusát. Ez az érték egy egész szám, amely megfelel az XML DOM csomóponttípus számozásának. A csomóponttípusok a következők:

1 = Elemcsomópont
2 = Attribútumcsomópont
3 = Szövegcsomópont
localname nvarchar Megadja az elem vagy attribútum helyi nevét. NULL ha a DOM objektumnak nincs neve.
prefix nvarchar A csomópont név előtagja.
namespaceuri nvarchar A csomópont névtér URI-je. Ha az érték , NULLnincs névtér.
data type nvarchar Az elem vagy attribútumsor tényleges adattípusa, egyébként .NULL Az adattípus a beágyazott DTD-ből vagy a beágyazott sémából származik.
prev bigint Az előző testvérelem XML azonosítója. NULL Ha nincs közvetlen előző testvér.
text kontextus Tartalmazza az attribútumértéket vagy az elem tartalmát szöveges formában (vagy ha NULL az edge tábla bejegyzéshez nincs szükség értékre).

Példák

A. Használj egy alap SELECT utasítást az OPENXML-lel

A következő példa belső ábrázolást hoz létre az XML képről a használatával.sp_xml_preparedocument SELECT Egy utasítást, amely sorhalmazszolgáltatót OPENXML használ, az XML dokumentum belső reprezentációja ellen fut le.

A zászlóérték .1 Ez az érték a leképezést jelzi attribute-centric . Ezért az XML attribútumok a sorhalmaz oszlopaihoz fordulnak. A sormintázat , amelyet úgy jelölnek /ROOT/Customer , azonosítja a <Customers> feldolgozandó csomópontokat.

Az opcionális ColPattern (oszlopmintázat) paraméter nincs megadva, mert az oszlop neve megegyezik az XML attribútumnevekkel.

A OPENXML sorhalmaz-szolgáltató létrehoz egy kétoszlopos sorhalmazt (CustomerID és ContactName), amelyből az utasítás SELECT visszanyeri a szükséges oszlopokat (ebben az esetben az összes oszlopot).

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

Itt van az eredmények összessége.

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

Ha ugyanazt SELECT az utasítást úgy hajtják végre, hogy zászlókat állítanak 2, ami leképezést jelez element-centric , akkor az XML dokumentumban mindkét ügyfél értéke CustomerIDContactName és értéke visszatérnek , NULLmivel nincs olyan elem az XML CustomerIDContactName dokumentumban.

Itt van az eredmények összessége.

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

B. Megadjuk a ColPattern-et az oszlopok és az XML attribútumok közötti leképezéshez

A következő lekérdezés visszaadja az XML dokumentumból az ügyfélazonosítót, rendelési dátumot, termékazonosítót és mennyiségi attribútumokat. A sormintázat azonosítja az <OrderDetails> elemeket. ProductID és Quantity az elem tulajdonságai <OrderDetails> . Azonban , OrderIDCustomerID, és OrderDate a szülőelem (<Orders>) attribútumjai.

Az opcionális ColPattern a következő leképezések esetén van megadva:

  • A sorhalmazban lévő OrderID, CustomerID, és OrderDate az XML dokumentumban sormintával azonosított csomópontok szülőjének attribútumjaihoz képezhetők.

  • A sorhalmaz oszlopa ProdID az ProductID attribútumhoz igazodik, a Qty sorhalmaz oszlopa pedig Quantity a sormintában azonosított csomópontok attribútumjához igazodik.

Bár a element-centric leképezést a flags paraméter határozza meg, a ColPattern-ben megadott leképezés felülírja ezt a leképezést.

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

Itt van az eredmények összessége.

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. Eredmények elérése edge table formátumban

Az alábbi példa XML dokumentuma , <Orders>, és <Order_0020_Details> elemekből áll<Customers>. Először sp_xml_preparedocument hívják, hogy megszerezzék a dokumentumkezelőt. Ez a dokumentum kezelő továbbítja .OPENXML

Az OPENXML utasításban a sormintázat (/ROOT/Customers) azonosítja a <Customers> feldolgozandó csomópontokat. Mivel a WITH záradék nincs megadva, OPENXML a sorhalmazt egy éltábla formátumban adja vissza.

Végül az SELECT állítás visszanyeri az összes oszlopot az edge táblában.

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;