Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Атрибутами метасвойств в документе 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"/>