Metatulajdonságok megadása az OPENXML-ben

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

Az XML-dokumentumok metaproperty attribútumai olyan attribútumok, amelyek egy XML-elem tulajdonságait írják le, például elem, attribútum vagy bármely más DOM-csomópont. Ezek az attribútumok fizikailag nem léteznek az XML-dokumentum szövegében. Az OPENXML azonban ezeket a metatulajdonságokat minden XML-elemhez biztosítja. Ezek a metatulajdonságok lehetővé teszik az XML-csomópontok olyan információinak kinyerését, mint például a helyi helymeghatározási és névtérinformációk. Ezek az információk a szöveges ábrázolásban láthatónál több részletet tartalmaznak.

Ezek a metatulajdonságok egy OPENXML utasítás soroszlopaihoz képezhetők le a ColPattern paraméter használatával. Az oszlopok azokat a metatulajdonság-értékeket fogják tartalmazni, amelyekhez hozzá vannak rendelve. További információ az OPENXML szintaxisáról: OPENXML (Transact-SQL).

A metaproperty attribútumok eléréséhez egy, az SQL Serverre jellemző névtér van megadva. Ez a névtér urn:schemas-microsoft-com:xml-metaprop lehetővé teszi a felhasználó számára a metaproperty attribútumok elérését. Ha egy OPENXML-lekérdezés eredménye éltábla formátumban van visszaadva, az éltábla minden metaproperty attribútumhoz egy oszlopot tartalmaz, kivéve a xmltext metaproperit.

A metaproperty attribútumok némelyike feldolgozásra szolgál. A xmltext metaproperty attribútum például a túlcsordulás kezelésére szolgál. A túlcsordulás kezelése a fel nem használt, nem feldolgozott adatokra utal a dokumentumban. Az OPENXML által létrehozott sorkészlet egyik oszlopa túlcsordulási oszlopként azonosítható. Ezt úgy teheti meg, hogy megfelelteti a xmltext metapropertynek a ColPattern paraméterrel. Az oszlop ezután megkapja a túlcsordulási adatokat. A zászlók paraméter határozza meg, hogy az oszlop tartalmaz-e mindent, vagy csak a fel nem használt adatokat.

Az alábbi táblázat felsorolja azokat a metaproperty attribútumokat, amelyekkel az egyes elemzett XML-elemek rendelkeznek. Ezek a metaproperty attribútumok a névtér urn:schemas-microsoft-com:xml-metaprophasználatával érhetők el. A rendszer figyelmen kívül hagyja azokat az értékeket, amelyeket a felhasználó közvetlenül az XML-dokumentumban a metaproperties használatával állít be.

Jegyzet

Ezekre a metaproperties-okra semmilyen XPath-navigációban nem hivatkozhat.

Metaproperty attribútum Leírás
@mp:id A DOM-csomópont rendszer által generált, dokumentumszintű azonosítóját biztosítja. Ha a dokumentum nincs újraelemzés alatt, ez az azonosító ugyanarra az XML-csomópontra hivatkozik.

A 0 XML ID azt jelzi, hogy az adott elem gyökérelem. Szülő XML-azonosítója NULL.
@mp:localname A csomópont nevének helyi részét tárolja. Előtaggal és névtér URI-val használják az elem- vagy attribútumcsomópontok elnevezéséhez.
@mp:namespaceuri Az aktuális elem névterének URI-ját adja meg. Ha ennek az attribútumnak az értéke NULL, nincs névtér
@mp:prefix Az aktuális elemnév névtérelőtagját tárolja.

Ha nincs előtag (NULL), és URI van megadva, az azt jelzi, hogy a megadott névtér az alapértelmezett névtér. Ha nincs megadva URI, nincs névtér csatolva.
@mp:prev Az előző testvért egy csomóponthoz viszonyítva tárolja. Ez információt nyújt a dokumentum elemeinek sorrendjéről.

@mp:prev az előző testvér XML-azonosítóját tartalmazza, amelynek ugyanaz a szülőeleme. Ha egy elem a testvérlista elején található, @mp:prev NULL értékű.
@mp:xmltext Feldolgozás céljából használják. Ez az elem és attribútumai szöveges szerializálása, valamint az alelemek, amelyeket az OPENXML túlcsordulásának kezelése során használnak.

Ez a táblázat azokat a további szülőtulajdonságokat mutatja be, amelyek lehetővé teszik a hierarchia információinak lekérését.

Szülő metaproperty attribútum Leírás
@mp:parentid Megfelel a ../\@mp:id
@mp:parentlocalname Megfelel a ../\@mp:localname
@mp:parentnamespacerui Megfelel a ../\@mp:namespaceuri
@mp:parentprefix Megfelel a ../\@mp:prefix

Példák

Az alábbi példák azt szemléltetik, hogy az OPENXML hogyan használható különböző sorhalmaznézetek létrehozására.

Egy. Az OPENXML sorhalmaz oszlopainak hozzárendelése a metatulajdonságokhoz

Ez a példa OPENXML használatával hozza létre a minta XML-dokumentum sorhalmaznézetét. Pontosabban azt mutatja be, hogy a különböző metaproperty attribútumok hogyan képezhetők le sorhalmazoszlopokra egy OPENXML-utasításban a ColPattern paraméter használatával.

Az OPENXML utasítás a következőket szemlélteti:

  • A id oszlop a @mp:id metaproperty attribútumra van leképezve, és azt jelzi, hogy az oszlop tartalmazza az elem rendszer által létrehozott egyedi XML-azonosítóját.

  • A parent oszlop a @mp:parentid-ra van leképezve, és jelzi, hogy az oszlop tartalmazza az elem szülőjének XML-azonosítóját.

  • A parentLocalName oszlop a @mp:parentlocalname-hez van hozzárendelve, és jelzi, hogy az oszlop a szülő helyi nevét tartalmazza.

A SELECT utasítás ezután az OPENXML által biztosított sorkészletet adja vissza:

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;

Ez az eredmény:

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. A teljes XML-dokumentum lekérése

Ebben a példában az OPENXML a minta XML-dokumentum egyoszlopos sorhalmaznézetének létrehozására szolgál. Ez az oszlop ( Col1) a xmltext metapropertyre van leképezve, és túlcsordulási oszloptá válik. Ennek eredményeképpen az oszlop megkapja a nem felhasznált adatokat. Ebben az esetben ez a teljes dokumentum.

A SELECT utasítás ezután visszaadja a teljes sorkészletet.

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

Ha az XML-deklaráció nélkül szeretné lekérni a teljes dokumentumot, a lekérdezés az alábbi módon adható meg:

SELECT *
FROM OPENXML (@idoc, '/root')
   WITH (Col1 ntext '@mp:xmltext')
EXEC sp_xml_removedocument @idoc;

A lekérdezés visszaadja a 'root' nevű gyökérelemet és azokat az adatokat, amelyeket a gyökérelem tartalmaz.

C. Az xmltext metaproperty megadása az el nem fogyasztott adatok lekéréséhez egy oszlopban

Ez a példa OPENXML használatával hozza létre a minta XML-dokumentum sorhalmaznézetét. A példa bemutatja, hogyan kérhetők le a nem megadott XML-adatok a xmltext metaproperty attribútumnak az OPENXML sorhalmazoszlopára való leképezésével.

A comment oszlop túlcsordulásoszlopként van azonosítva, mivel a @mp:xmltext metatulajdonsághoz van hozzárendelve. A zászlók paramétere 9 értékre van állítva (XML_ATTRIBUTE és XML_NOCOPY). Ez attribute-centric leképezést jelez, és azt jelzi, hogy csak az el nem fogyasztott adatokat kell átmásolni a túlcsordulási oszlopba.

A SELECT utasítás ezután az OPENXML által biztosított sorkészletet adja vissza.

Ebben a példában a @mp:parentlocalname metaproperty az OPENXML által létrehozott sorhalmazban ParentLocalNameoszlophoz van beállítva. Ennek eredményeként ez az oszlop tartalmazza a szülőelem helyi nevét.

A sorkészletben két további oszlop van megadva, parent és comment. A parent oszlop a @mp:parentid-hez van hozzárendelve, és azt jelzi, hogy az oszlop tartalmazza az elem szülőelemének XML-azonosítóját. A megjegyzésoszlopot túlcsordulási oszlopként azonosítja a @mp:xmltext metapropertyhez való leképezésével.

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;

Ez az eredmény. Mivel az oidoszlopok és a dátumoszlopok már használatban vannak, nem jelennek meg a túlcsordulás oszlopban.

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"/>

Lásd még: