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


Задание метасвойств в OPENXML

Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure

Атрибутами метасвойств в документе 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: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 создать различные представления наборов строк.

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

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

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

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

B. Получение всего 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.

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

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

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

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

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

См. также