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


Функции метода доступа к данным — data (XQuery)

Область применения: SQL Server

Возвращает типизированное значение для каждого элемента, указанного $arg.

Синтаксис

  
fn:data ($arg as item()*) as xdt:untypedAtomic*  

Аргументы

$arg
Последовательность элементов, типизированные значения которых будут возвращены.

Замечания

Следующее применимо к типизированным значениям:

  • Типизированное значение атомного значения является атомным значением.

  • Типизированное значение узла текста является строковым значением узла текста.

  • Типизированное значение комментария является строковым значением комментария.

  • Типизированное значение инструкции по обработке является содержимым инструкции обработки, без целевого имени инструкции обработки.

  • Типизированное значение узла документов является его строковым значением.

Следующее применимо к узлам атрибутов и элементов:

  • Если узел атрибута типизирован посредством XML-схемы, его типизированное значение соответственно является типизированным значением.

  • Если узел атрибута нетипичен, его типизированное значение равно строкового значения, возвращаемого как экземпляр xdt:untypedAtomic.

  • Если узел элемента не был введен, его типизированное значение равно строкового значения, возвращаемого как экземпляр xdt:untypedAtomic.

Следующие характеристики относятся к типизированным узлам элемента:

  • Если элемент имеет простой тип контента, data() возвращает типизированное значение элемента.

  • Если узел имеет сложный тип, включая xs:anyType, data() возвращает статическую ошибку.

Хотя использование функции data() часто является необязательным, как показано в следующих примерах, указывая функцию data() явно увеличивает удобочитаемость запросов. Дополнительные сведения см. в разделе "Основы XQuery".

Нельзя указать данные() в созданном XML, как показано в следующем примере:

declare @x xml  
set @x = ''  
select @x.query('data(<SomeNode>value</SomeNode>)')  

Примеры

В этом разделе приведены примеры XQuery для экземпляров XML, хранящихся в различных столбцах типов XML в базе данных AdventureWorks.

А. Использование функции 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:Specification/Material возвращает <Material> элемент. Кроме того, data($pd/p1:Specification/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>Aluminum Alloy</Material>Aluminum 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