Функция data (XQuery)
Возвращает типизированное значение для каждого элемента, указанного $arg.
Синтаксис
fn:data ($arg as item()*) as xdt:untypedAtomic*
Аргументы
- $arg
Последовательность элементов, типизированные значения которых будут возвращены.
Замечания
Следующее применимо к типизированным значениям:
- Типизированное значение атомного значения является атомным значением.
- Типизированное значение узла текста является строковым значением узла текста.
- Типизированное значение комментария является строковым значением комментария.
- Типизированное значение инструкции по обработке является содержимым инструкции обработки, без целевого имени инструкции обработки.
- Типизированное значение узла документов является его строковым значением.
Следующее применимо к узлам атрибутов и элементов:
- Если узел атрибута типизирован посредством XML-схемы, его типизированное значение соответственно является типизированным значением.
- Если узел атрибута не типизирован, его типизированное значение соответствует строковому значению, возвращаемому как экземпляр xdt:untypedAtomic.
- Если узел элемента не типизирован, его типизированное значение соответствует строковому значению, возвращаемому как экземпляр xdt:untypedAtomic.
Следующие характеристики относятся к типизированным узлам элемента:
- Если элемент относится к простому типу содержимого, функция data() возвращает типизированное значение элемента.
- Если узел относится к сложному типу, включая xs:anyType, функция data() возвращает статическую ошибку.
Хотя применение функции data() зачастую не является обязательным, как это показано в следующих примерах, определение функции data() явно повышает удобочитаемость запроса. Дополнительные сведения см. в разделе Основы языка XQuery.
Как показано ниже, нельзя указать функцию data() для конструируемого XML:
declare @x xml
set @x = ''
select @x.query('data(<SomeNode>value</SomeNode>)')
Примеры
В этом подразделе рассматриваются примеры использования XQuery с экземплярами XML, которые хранятся в базе данных AdventureWorks в различных столбцах типа XML. Обзор каждого из этих столбцов см. в разделе Представление типов xml-данных в базе данных AdventureWorks.
A. Использование функции data() XQuery для извлечения типизированного значения узла
Следующий запрос иллюстрирует использование функции data() для получения узлов атрибута, элемента и текста:
WITH XMLNAMESPACES (
'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS p1,
'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain' AS wm)
SELECT CatalogDescription.query(N'
for $pd in //p1:ProductDescription
return
<Root
ProductID = "{ data( ($pd//@ProductModelID)[1] ) }"
Feature = "{ data( ($pd/p1:Features/wm:Warranty/wm:Description)[1] ) }" >
</Root>
') as Result
FROM Production.ProductModel
WHERE ProductModelID = 19
Результат:
<Root ProductID="19" Feature="parts and labor"/>
Как упоминалось, при создании атрибутов функция data() не является обязательной. Если функция data() не указана, она неявно подразумевается. Этот запрос формирует те же результаты, что и предыдущий запрос:
WITH XMLNAMESPACES (
'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS p1,
'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain' AS wm)
SELECT CatalogDescription.query('
for $pd in //p1:ProductDescription
return
<Root
ProductID = "{ ($pd/@ProductModelID)[1] }"
Feature = "{ ($pd/p1:Features/wm:Warranty/wm:Description)[1] }" >
</Root>
') as Result
FROM Production.ProductModel
WHERE ProductModelID = 19
Следующие примеры иллюстрируют экземпляры, в которых функция data() необходима.
В данном запросе $pd/p1:Specifications/Material возвращает элемент <Material
>. Также data($pd/p1:Specifications/ Material) возвращает символьные данные, типизированные как xdt:untypedAtomic, так как элемент <Material
> является нетипизированным. Если входные данные не типизированы, результат data() типизируется как xdt:untypedAtomic.
SELECT CatalogDescription.query('
declare namespace p1="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
for $pd in //p1:ProductDescription
return
<Root>
{ $pd/p1:Specifications/Material }
{ data($pd/p1:Specifications/Material) }
</Root>
') as Result
FROM Production.ProductModel
WHERE ProductModelID = 19
Результат:
<Root>
<Material>Almuminum Alloy</Material>Almuminum Alloy
</Root>
В следующем запросе data($pd/p1:Features/wm:Warranty) возвращает статическую ошибку, потому что элемент <Warranty
> относится к элементам сложного типа.
WITH XMLNAMESPACES (
'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS p1,
'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain' AS wm)
SELECT CatalogDescription.query('
<Root>
{ /p1:ProductDescription/p1:Features/wm:Warranty }
{ data(/p1:ProductDescription/p1:Features/wm:Warranty) }
</Root>
') as Result
FROM Production.ProductModel
WHERE ProductModelID = 23
См. также
Справочник
Применение функций XQuery к типу данных XML