Dela via


Ange metaegenskaper i OPENXML

gäller för:SQL ServerAzure SQL DatabaseAzure 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"/>

Se även