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


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

Справка и поддержка

Получение помощи по SQL Server 2005