Not
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Gäller för:SQL Server
Azure SQL Database
Azure SQL Managed Instance
SQL-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-centricellerelement-centricmappningen enligt flaggor).XPath-mönstret som anges som ColPattern används för att specificera den speciella karaktären hos mappningen (för
attribute-centricochelement-centricmappningen) 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 = Elementnod2 = Attributnod3 = 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, ochOrderDatei raduppsättningen mappas till attributen för föräldern till noderna som identifieras av radmönster i XML-dokumentet.Kolumnen
ProdIDi raduppsättningen motsvarar attributetProductID, och kolumnenQtyi raduppsättningen motsvararQuantityattributet 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;