Определение метасвойств в инструкции 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 с помощью метасвойств, игнорируется.

ms178088.note(ru-ru,SQL.90).gifПримечание.
На метасвойства нельзя ссылаться при перемещении по XML с помощью XPath.
Атрибут метасвойства Описание

@mp:id

Формируемый системой идентификатор узла DOM, действующий в пределах документа. Если документ не подлежит повторному синтаксическому анализу, этот идентификатор ссылается на тот же узел XML.

Идентификатор XML, равный 0, обозначает корневой элемент. У такого узла идентификатор XML родительского элемента равен значению NULL.

@mp:localname

Локальная часть имени узла. Применяется вместе с префиксом и URI пространства имен для обозначения элементов и узлов атрибутов.

@mp:namespaceuri

URI пространства имен текущего элемента. Если значение атрибута равно NULL, пространство имен не существует.

@mp:prefix

Префикс пространства имен текущего элемента.

Если префикс отсутствует (равен значению 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:prefix

Примеры

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

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

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

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

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

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

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

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

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

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

Столбец comment указан в качестве столбца переполнения путем привязки к метасвойству @mp:xmltext. Для параметра flags установлено значение 9 (XML_ATTRIBUTE and XML_NOCOPY). Оно соответствует атрибутивному сопоставлению и указывает, что в столбец переполнения необходимо скопировать только невостребованные данные.

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

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

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

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

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

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

См. также

Справочник

Запросы XML с использованием OPENXML

Другие ресурсы

OPENXML (Transact-SQL)

Справка и поддержка

Получение помощи по SQL Server 2005