Určení metapropertů v OPENXML
platí pro:SQL Server
Azure SQL Database
azure 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 Col1
je 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"/>