Sdílet prostřednictvím


Určení metapropertů v OPENXML

platí pro:SQL ServerAzure SQL Databaseazure SQL Managed Instance

Atributy metaproperty v dokumentu XML jsou atributy, které popisují vlastnosti položky XML, jako je element, atribut nebo jakýkoli jiný uzel DOM. Tyto atributy fyzicky neexistují v textu dokumentu XML. OPENXML však poskytuje tyto metaproperty pro všechny položky XML. Tyto metaproperty umožňují extrahovat informace o uzlech XML, jako jsou místní umístění a informace o oboru názvů. Tyto informace poskytují více podrobností, než je zřejmé v textové reprezentaci.

Tyto metaproperty můžete mapovat na sloupce sady řádků v příkazu OPENXML pomocí parametru ColPattern. Sloupce budou obsahovat hodnoty metapropertů, na které se mapují. Další informace o syntaxi OPENXML naleznete v tématu OPENXML (Transact-SQL).

Pro přístup k atributům metaproperty je k dispozici obor názvů, který je specifický pro SQL Server. Tento obor názvů urn:schemas-microsoft-com:xml-metaprop umožňuje uživateli přístup k atributům metaproperty. Pokud je výsledek dotazu OPENXML vrácen ve formátu tabulky edge, tabulka hran obsahuje jeden sloupec pro každý atribut metaproperty s výjimkou xmltext metaproperty.

Některé atributy metaproperty se používají pro účely zpracování. Například atribut metavlastnosti xmltext se používá pro zpracování přetečení. Zpracování přetečení odkazuje na nespotřebovaná, nezpracovaná data v dokumentu. Jeden ze sloupců v sadě řádků vygenerované pomocí OPENXML lze identifikovat jako sloupec přetečení. Provedete to tak, že ho namapujete na metaproperty xmltext pomocí parametru ColPattern. Sloupec potom obdrží přetékající data. Parametr s příznakem určuje, jestli sloupec obsahuje všechna data nebo jen nevyužitá data.

Následující tabulka uvádí atributy metaproperty, které každý parsovaný element XML má. K těmto atributům metaproperty lze přistupovat pomocí oboru názvů urn:schemas-microsoft-com:xml-metaprop. Jakákoli hodnota, kterou uživatel nastaví přímo v dokumentu XML pomocí těchto metaproperties, se ignoruje.

Poznámka

Na tyto metaproperty nelze odkazovat v žádné navigaci XPath.

Atribut Metaproperty Popis
@mp:id Poskytuje systémem vygenerovaný, dokumentový identifikátor uzlu DOM. Pokud dokument není znovu zpracován, odkazuje toto ID na stejný uzel XML.

ID XML 0 označuje, že element je kořenový prvek. Nadřazené ID XML má hodnotu NULL.
@mp:localname Uloží místní část názvu uzlu. Používá se s předponou a identifikátorem URI oboru názvů k pojmenování elementu nebo uzlů atributů.
@mp:namespaceuri Poskytuje URI oboru názvů aktuálního prvku. Pokud je hodnota tohoto atributu NULL, neexistuje žádný obor názvů.
@mp:prefix Uloží předponu oboru názvů aktuálního jména prvku.

Pokud není k dispozici žádná předpona (NULL) a je zadán identifikátor URI, znamená to, že zadaný obor názvů je výchozím oborem názvů. Pokud není zadán žádný identifikátor URI, není připojen žádný obor názvů.
@mp:prev Uloží předchozího sourozence uzlu. Poskytuje informace o řazení prvků v dokumentu.

@mp:prev obsahuje ID XML předchozího sourozence se stejným nadřazeným elementem. Pokud je prvek na začátku seznamu, @mp:prev je NULL.
@mp:xmltext Používá se pro účely zpracování. Jedná se o textovou serializaci prvku a jeho atributů a také podprvků, jak se používá při zpracování přetečení v OPENXML.

Tato tabulka zobrazuje další nadřazené vlastnosti, které jsou k dispozici a které umožňují načíst informace o hierarchii.

Nadřazený atribut metavlastnosti Popis
@mp:parentid Odpovídá ../\@mp:id
@mp:parentlocalname Odpovídá ../\@mp:localname
@mp:parentnamespacerui Odpovídá ../\@mp:namespaceuri
@mp:parentprefix Odpovídá ../\@mp:prefix

Příklady

Následující příklady ukazují, jak se OPENXML používá k vytváření různých zobrazení sady řádků.

A. Mapování sloupců sady řádků OPENXML na metaproperties

Tento příklad používá OPENXML k vytvoření zobrazení sady řádků ukázkového dokumentu XML. Konkrétně ukazuje, jak lze různé atributy metaproperty mapovat na sloupce sady řádků v příkazu OPENXML pomocí ColPattern parametru.

Příkaz OPENXML znázorňuje následující:

  • Sloupec id je mapován na atribut @mp:id metaproperty a označuje, že sloupec obsahuje systémem generované jedinečné ID XML elementu.

  • Sloupec parent je mapován na @mp:parentid a označuje, že sloupec obsahuje ID XML nadřazeného prvku.

  • Sloupec parentLocalName se mapuje na @mp:parentlocalname a označuje, že sloupec obsahuje místní název nadřazeného objektu.

Příkaz SELECT pak vrátí sadu řádků, kterou poskytuje 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;

Toto je výsledek:

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. Načtení celého dokumentu XML

V tomto příkladu se OPENXML používá k vytvoření zobrazení sady řádků s jedním sloupcem ukázkového dokumentu XML. Tento sloupec Col1je namapován na metaproperty xmltext a stává se sloupcem pro přetečení. V důsledku toho sloupec obdrží nevyužitá data. V tomto případě je to celý dokument.

Příkaz SELECT pak vrátí úplnou sadu řádků.

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

Chcete-li načíst celý dokument bez deklarace XML, je možné zadat dotaz, jak je znázorněno v následujícím příkladu:

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

Dotaz vrátí kořenový prvek, který má název 'root', a data obsažená v kořenovém prvku.

C. Určení metavlastnosti xmltext pro načtení nespotřebovaných dat ve sloupci

Tento příklad používá OPENXML k vytvoření zobrazení sady řádků ukázkového dokumentu XML. Příklad ukazuje, jak načíst nespotřebovaná data XML mapováním metaprvkového atributu xmltext do sloupce sady řádků v OPENXML.

Sloupec comment je identifikován jako sloupec přetečení tím, že je namapován na metaproperty @mp:xmltext. Parametr příznaků je nastaven na 9 (XML_ATTRIBUTE a XML_NOCOPY). To označuje attribute-centric mapování a označuje, že se do sloupce přetečení mají zkopírovat pouze nekonsumovaná data.

Příkaz SELECT pak vrátí sadu řádků, kterou poskytuje OPENXML.

V tomto příkladu je @mp:parentlocalname metaproperty nastaven pro sloupec, ParentLocalName, v sadě řádků vygenerované OPENXML. V důsledku toho tento sloupec obsahuje místní název nadřazeného prvku.

V sadě řádků jsou zadány dva další sloupce, parent a comment. Sloupec parent je mapován na @mp:parentid a označuje, že sloupec obsahuje ID XML nadřazeného prvku elementu. Sloupec komentáře se identifikuje jako sloupec přetečení mapováním na metavlastnost @mp:xmltext.

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;

Toto je výsledek. Vzhledem k tomu, že sloupce oid a sloupce kalendářních dat jsou už spotřebované, nezobrazují se ve sloupci přetečení.

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

Viz také

  • OPENXML (Transact-SQL)
  • OPENXML (SQL Server)