Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A következőkre vonatkozik:SQL Server
Azure SQL Database
Felügyelt Azure SQL-példány
SQL-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-centricvagyelement-centrica 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-centrica 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 .
OPENXMLHa 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ópont2 = Attribútumcsomópont3 = 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, ésOrderDateaz XML dokumentumban sormintával azonosított csomópontok szülőjének attribútumjaihoz képezhetők.A sorhalmaz oszlopa
ProdIDazProductIDattribútumhoz igazodik, aQtysorhalmaz oszlopa pedigQuantitya 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;