Поделиться через


Определение метасвойств в инструкции OPENXML

Атрибутами метасвойств в документе XML называются атрибуты, описывающие свойства сущностей XML, например элементов, атрибутов и других узлов DOM. Эти атрибуты физически не существуют в тексте XML-документа. Тем не менее инструкция OPENXML предоставляет эти метасвойства для всех сущностей XML. Эти метасвойства позволяют извлекать сведения, например данные о локальном положении и пространстве имен, об узлах XML. Эти сведения предоставляют более подробные данные, чем текстовое представление.

Метасвойства можно сопоставить со столбцами набора строк инструкции OPENXML при помощи параметра ColPattern . Столбцы будут содержать значения метасвойств, которым они соответствуют. Дополнительные сведения о синтаксисе OPENXML см. в разделе OPENXML (Transact-SQL).

Предоставляется пространство имен, специфичное для SQL Server, для доступа к атрибутам метасвойств. Это пространство имен urn:schemas-microsoft-com:xml-metaprop позволяет пользователю получить доступ к атрибутам метасвойств. Если результат запроса OPENXML возвращается в формате таблицы граней, таблица граней содержит один столбец для каждого атрибута метасвойства, за исключением метасвойства xmltext.

Некоторые атрибуты метасвойств используются в целях обработки. Например, атрибут метапропастерии xmltext используется для обработки переполнения. Управление переполнением относится к неиспользованным, необработанным данным в документе. Один столбец набора строк, сформированного инструкцией OPENXML, можно назначить столбцом переполнения. Для этого необходимо сопоставить его с метапропаптом xmltext с помощью параметра ColPattern . Столбец затем принимает данные переполнения. Параметр flags определяет, какие данные содержит столбец: все или только невостребованные.

В следующей таблице перечислены атрибуты метасвойств, которыми обладают все анализируемые элементы XML. К этим атрибутам метапрописи можно получить доступ с помощью пространства имен urn:schemas-microsoft-com:xml-metaprop. Значение, заданное непосредственно в документе XML с помощью метасвойств, игнорируется.

Замечание

Невозможно ссылаться на эти метасвойства при навигации с помощью XPath.

Атрибут метасвойства Описание
@mp:id Системно генерируемый идентификатор узла DOM для всего документа. Если документ не будет восстановлен, этот идентификатор ссылается на тот же XML-узел.

XML-идентификатор 0 указывает, что элемент является корневым элементом. Идентификатор XML родительского элемента равен NULL.
@mp:localname Сохраняет локальную часть имени узла. Применяется вместе с префиксом и URI пространства имён для обозначения элементов и атрибутных узлов.
@mp:namespaceuri URI пространства имен текущего элемента. Если значение атрибута равно NULL, пространство имен не существует.
@mp:префикс Хранит префикс пространства имен текущего элемента.

Если префикс отсутствует (равен значению NULL), а URI задан, значит, указанное пространство имен используется по умолчанию. Если URI не задан, пространство имен не присоединяется.
@mp:prev Хранит предыдущего брата узла. Благодаря этому можно получить сведения о порядке элементов документа.

@mp:prev содержит XML-идентификатор предыдущего брата с тем же родительским элементом. Если элемент находится в передней части списка братьев и сестер, @mp:prev имеет значение NULL.
@mp:xmltext Применяется для обработки. Текстовая сериализация элемента, его атрибутов, а также подэлементов, используемая для обработки переполнения в OPENXML.

В следующей таблице перечислены дополнительные родительские свойства, которые позволяют получить сведения об иерархии.

Родительский атрибут метасвойства Описание
@mp:parentid Соответствует ..../@mp:id
@mp:parentlocalname Соответствует .. /@mp:localname
@mp:parentnamespacerui Соответствует .. /@mp:namespaceuri
@mp:parentprefix Соответствует ../@mp:префикс

Примеры

Следующие примеры демонстрируют, как при помощи инструкции OPENXML создать различные представления наборов строк.

А. Сопоставление столбцов набора строк OPENXML с метасвойствами

В этом примере OPENXML используется для создания представления набора строк из образца XML-документа. В частности, пример демонстрирует, как различные атрибуты метасвойств можно связать со столбцами набора строк инструкции OPENXML при помощи параметра ColPattern .

Инструкция OPENXML иллюстрирует следующее:

  • Столбец id сопоставляется с атрибутом @mp:id метасвойства и указывает, что столбец содержит уникальный XML-идентификатор элемента, созданный системой.

  • Родительский столбец сопоставляется с @mp:parentid и указывает, что столбец содержит XML-идентификатор родительского элемента.

  • Столбец parentLocalName сопоставляется с @mp:parentlocalname и указывает, что столбец содержит локальное имя родительского элемента.

Инструкция SELECT возвращает набор строк, предоставленных 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  

Результат:

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  

В. Получение всего XML-документа

В этом примере инструкция OPENXML используется для создания одностолбцового представления набора строк примера XML-документа. Этот столбец Col1 сопоставляется с метапропаптом xmltext и становится столбцом переполнения. В результате столбец получает невостребованные данные. В этом случае это весь документ.

Затем инструкция SELECT возвращает полный набор строк.

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

Чтобы получить весь документ без объявления XML, запрос можно указать следующим образом:

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

Запрос возвращает корневой элемент с именем root и данные, которые содержатся в этом корневом элементе.

С. Определение метасвойства xmltext для получения невостребованных данных в столбце

В этом примере OPENXML используется для создания представления набора строк из образца XML-документа. В примере показано, как получить неиспользованные XML-данные путем сопоставления атрибута метасвойства xmltext со столбцом набора строк в OPENXML.

Столбец комментариев определяется как столбец переполнения, сопоставляя его с метапропастерией @mp:xmltext . Параметр флагов имеет значение 9 (XML_ATTRIBUTE и XML_NOCOPY). Это указывает на ориентированное на атрибуты сопоставление и указывает, что в столбец переполнения должны быть скопированы только неиспользованные данные.

Затем инструкция SELECT возвращает набор строк, предоставленных OPENXML.

В этом примере метасвойство @mp:parentlocalname устанавливается как для столбца ParentLocalName в наборе строк, созданном через OPENXML. В результате этот столбец содержит локальное имя родительского элемента.

Два дополнительных столбца указываются в наборе строк, родитель и примечание. Родительский столбец сопоставляется с @mp:parentid и указывает, что столбец содержит XML-идентификатор родительского элемента элемента. Столбец комментариев идентифицируется как столбец переполнения путем его сопоставления с метапроперти @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  

Вот результат. Так как столбцы и столбцы даты уже используются, они не отображаются в столбце переполнения.

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

См. также

OPENXML (Transact-SQL)
OPENXML (SQL Server)