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


Функция 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-данных, хранящимся в различных столбцах типа xml в базе данных База данных AdventureWorks2008R2. Обзор каждого из этих столбцов см. в разделе Представление типов данных XML в базе данных AdventureWorks2008R2.

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;

См. также

Справочник