Функция 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