Задание метасвойств в 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"/>