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


Указание метапродажей в OPENXML

Применяется к:SQL ServerAzure SQL DatabaseAzure, управляемому экземпляру 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 с помощью метасвойств, игнорируется.

Заметка

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

Атрибут метасвойства Description
@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.

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

Родительский атрибут метасвойства Description
@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;

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

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

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

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

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

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

В наборе строк указаны два дополнительных столбца и parentcomment. Столбец 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   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"/>

См. также