Ange metaegenskaper i OPENXML
gäller för:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Metaproperty-attribut i ett XML-dokument är attribut som beskriver egenskaperna för ett XML-objekt, till exempel element, attribut eller någon annan DOM-nod. Dessa attribut finns inte fysiskt i XML-dokumenttexten. OpenXML tillhandahåller dock dessa metaegenskaper för alla XML-objekt. Med dessa metaegenskaper kan du extrahera information, till exempel lokal positionering och namnområdesinformation, för XML-noder. Den här informationen ger dig mer information än vad som visas i textrepresentationen.
Du kan mappa dessa metaegenskaper till raduppsättningskolumnerna i en OPENXML-instruktion med hjälp av parametern ColPattern. Kolumnerna innehåller värdena för de metaegenskaper som de mappas till. Mer information om syntaxen för OPENXML finns i OPENXML (Transact-SQL).
För att få åtkomst till metaproperty-attributen tillhandahålls ett namnområde som är specifikt för SQL Server. Det här namnområdet urn:schemas-microsoft-com:xml-metaprop
tillåter användaren att komma åt metaproperty-attributen. Om resultatet av en OPENXML-fråga returneras i ett kanttabellformat innehåller kanttabellen en kolumn för varje metaproperty-attribut, förutom xmltext
metaproperty.
Några av metaproperty-attributen används i bearbetningssyfte. Till exempel används attributet xmltext
metaproperty för hantering av spill. Överflödeshantering avser oförbrukad och obearbetad data i dokumentet. En av kolumnerna i raduppsättningen som genereras av OPENXML kan identifieras som spillkolumnen. Du gör detta genom att mappa det till xmltext
metaproperty med hjälp av parametern ColPattern. Kolumnen tar sedan emot spilldata. Flaggan parametern avgör om kolumnen innehåller allt eller endast de okonsumerade data.
I följande tabell visas de metaproperty-attribut som varje parsat XML-element har. Dessa metaproperty-attribut kan nås med hjälp av namnområdet urn:schemas-microsoft-com:xml-metaprop
. Alla värden som användaren anger direkt i XML-dokumentet med hjälp av dessa metaegenskaper ignoreras.
Obs
Du kan inte referera till dessa metaegenskaper i någon XPath-navigering.
Metaproperty-attribut | Beskrivning |
---|---|
@mp:id |
Tillhandahåller en systemgenererad, dokumentomfattande identifierare för DOM-noden. Så länge dokumentet inte har återskapats refererar det här ID:t till samma XML-nod. Ett XML-ID för 0 anger att elementet är ett rotelement. Dess överordnade XML-ID är NULL. |
@mp:localname |
Lagrar den lokala delen av nodens namn. Det används med ett prefix och en namnområdes-URI till namnelement eller attributnoder. |
@mp:namespaceuri |
Tillhandahåller namnområdes-URI:n för det aktuella elementet. Om värdet för det här attributet är NULL finns inget namnområde |
@mp:prefix |
Lagrar namnområdesprefixet för det aktuella elementnamnet. Om inget prefix finns (NULL) och en URI anges anger det att det angivna namnområdet är standardnamnområdet. Om ingen URI anges bifogas inget namnområde. |
@mp:prev |
Lagrar det tidigare syskonet i förhållande till en nod. Detta ger information om ordningen på element i dokumentet.@mp:prev innehåller XML-ID:t för föregående syskon som har samma överordnade element. Om ett element finns längst fram i syskonlistan är @mp:prev NULL. |
@mp:xmltext |
Används i bearbetningssyfte. Det är textuell serialisering av elementet och dess attribut, samt även dess underelement, som används i hanteringen av överfullhet i OPENXML. |
Den här tabellen visar de ytterligare överordnade egenskaper som tillhandahålls och som gör att du kan hämta information om hierarkin.
Överordnat metaprototypartribut | Beskrivning |
---|---|
@mp:parentid |
Motsvarar ../\@mp:id |
@mp:parentlocalname |
Motsvarar ../\@mp:localname |
@mp:parentnamespacerui |
Motsvarar ../\@mp:namespaceuri |
@mp:parentprefix |
Motsvarar ../\@mp:prefix |
Exempel
Följande exempel illustrerar hur OPENXML används för att skapa olika raderuppsättningsvyer.
A. Mappa kolumnerna i OPENXML-raduppsättningen till metaegenskaperna
I det här exemplet används OPENXML för att skapa en raduppsättningsvy av XML-exempeldokumentet. Mer specifikt visar den hur de olika metaproperty-attributen kan mappas till raderuppsättningskolumner i en OPENXML-instruktion med hjälp av parametern ColPattern.
OPENXML-instruktionen illustrerar följande:
Kolumnen
id
mappas till attributet@mp:id
metaproperty och anger att kolumnen innehåller det systemgenererade unika XML-ID:t för elementet.Kolumnen
parent
mappas till@mp:parentid
och anger att kolumnen innehåller XML-ID:t för elementets överordnade.Kolumnen
parentLocalName
mappas till@mp:parentlocalname
och anger att kolumnen innehåller det lokala namnet på överordnade.
SELECT-instruktionen returnerar sedan den raduppsättning som tillhandahålls av OPENXML:
DECLARE @idoc int;
DECLARE @doc nvarchar(1000);
-- Sample XML document
SET @doc = N'<root>
<Customer cid= "C1" name="Janine" city="Issaquah">
<Order oid="O1" date="1/20/1996" amount="3.5" />
<Order oid="O2" date="4/30/1997" amount="13.4">Customer was very satisfied</Order>
</Customer>
<Customer cid="C2" name="Ursula" city="Oelde" >
<Order oid="O3" date="7/14/1999" amount="100" note="Wrap it blue white red">
<Urgency>Important</Urgency>
</Order>
<Order oid="O4" date="1/20/1996" amount="10000"/>
</Customer>
</root>';
-- Create an internal representation of the XML document.
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc;
-- Execute a SELECT statement using OPENXML rowset provider.
SELECT *
FROM OPENXML (@idoc, '/root/Customer/Order', 9)
WITH (id int '@mp:id',
oid char(5),
date datetime,
amount real,
parentIDNo int '@mp:parentid',
parentLocalName varchar(40) '@mp:parentlocalname');
EXEC sp_xml_removedocument @idoc;
Det här är resultatet:
id oid date amount parentIDNo parentLocalName
--- ------- ---------------------- ---------- ------------ ---------------
6 O1 1996-01-20 00:00:00.000 3.5 2 Customer
10 O2 1997-04-30 00:00:00.000 13.4 2 Customer
19 O3 1999-07-14 00:00:00.000 100.0 15 Customer
25 O4 1996-01-20 00:00:00.000 10000.0 15 Customer
B. Hämta hela XML-dokumentet
I det här exemplet används OPENXML för att skapa en raduppsättningsvy med en kolumn i XML-exempeldokumentet. Den här kolumnen, Col1
, mappas till xmltext
metaproperty och blir en spillkolumn. Som ett resultat tar kolumnen emot oförbrukade data. I det här fallet är det hela dokumentet.
SELECT-instruktionen returnerar sedan den fullständiga raduppsättningen.
DECLARE @idoc int;
DECLARE @doc nvarchar(1000);
SET @doc = N'<?xml version="1.0"?>
<root>
<Customer cid= "C1" name="Janine" city="Issaquah">
<Order oid="O1" date="1/20/1996" amount="3.5" />
<Order oid="O2" date="4/30/1997" amount="13.4">Customer was very
satisfied</Order>
</Customer>
<Customer cid="C2" name="Ursula" city="Oelde" >
<Order oid="O3" date="7/14/1999" amount="100" note="Wrap it blue
white red">
<MyTag>Testing to see if all the subelements are returned</MyTag>
<Urgency>Important</Urgency>
</Order>
<Order oid="O4" date="1/20/1996" amount="10000"/>
</Customer>
</root>';
-- Create an internal representation of the XML document.
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc;
-- Execute a SELECT statement using OPENXML rowset provider.
SELECT *
FROM OPENXML (@idoc, '/')
WITH (Col1 ntext '@mp:xmltext')
Om du vill hämta hela dokumentet utan XML-deklarationen kan frågan anges enligt följande:
SELECT *
FROM OPENXML (@idoc, '/root')
WITH (Col1 ntext '@mp:xmltext')
EXEC sp_xml_removedocument @idoc;
Frågan returnerar rotelementet som har namnroten och de data som finns i rotelementet
C. Ange xmltext-metapropertyn för att hämta oförbrukade data i en kolumn
I det här exemplet används OPENXML för att skapa en raduppsättningsvy av XML-exempeldokumentet. Exemplet visar hur du hämtar xml-data som inte är förbrukningsdata genom att mappa attributet xmltext
metaproperty till en raduppsättningskolumn i OPENXML.
Kolumnen comment
identifieras som spillkolumnen genom att mappa den till @mp:xmltext
metaproperty. Parametern flaggor anges till 9
(XML_ATTRIBUTE och XML_NOCOPY). Detta indikerar attribute-centric
-mappning och visar att endast den outnyttjade datan ska kopieras till överflödskolumnen.
SELECT-instruktionen returnerar sedan den raduppsättning som tillhandahålls av OPENXML.
I det här exemplet anges @mp:parentlocalname
metaproperty för en kolumn, ParentLocalName
, i raduppsättningen som genereras av OPENXML. Därför innehåller den här kolumnen det lokala namnet på det överordnade elementet.
Två ytterligare kolumner anges i raduppsättningen, parent
och comment
. Kolumnen parent
mappas till @mp:parentid
och anger att kolumnen innehåller XML-ID:t för elementets överordnade element. Kommentarskolumnen identifieras som spillkolumnen genom att mappa den till @mp:xmltext
metaproperty.
DECLARE @idoc int;
DECLARE @doc nvarchar(1000);
-- sample XML document
SET @doc = N'<root>
<Customer cid= "C1" name="Janine" city="Issaquah">
<Order oid="O1" date="1/20/1996" amount="3.5" />
<Order oid="O2" date="4/30/1997" amount="13.4">Customer was very satisfied</Order>
</Customer>
<Customer cid="C2" name="Ursula" city="Oelde" >
<Order oid="O3" date="7/14/1999" amount="100" note="Wrap it blue white red">
<Urgency>Important</Urgency>
</Order>
<Order oid="O4" date="1/20/1996" amount="10000"/>
</Customer>
</root>
';
-- Create an internal representation of the XML document.
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc;
-- Execute a SELECT statement using OPENXML rowset provider.
SELECT *
FROM OPENXML (@idoc, '/root/Customer/Order', 9)
WITH (oid char(5),
date datetime,
comment ntext '@mp:xmltext');
EXEC sp_xml_removedocument @idoc;
Det här är resultatet. Eftersom oidkolumnerna och datumkolumnerna redan används visas de inte i spillkolumnen.
oid date comment
----- --------------------------- ----------------------------------------
O1 1996-01-20 00:00:00.000 <Order amount="3.5"/>
O2 1997-04-30 00:00:00.000 <Order amount="13.4">Customer was very
satisfied</Order>
O3 1999-07-14 00:00:00.000 <Order amount="100" note="Wrap it blue
white red"><Urgency>
Important</Urgency></Order>
O4 1996-01-20 00:00:00.000 <Order amount="10000"/>