Funções do Acessador de Dados – data (XQuery)

Aplica-se a:SQL Server

Retorna o valor digitado para cada item especificado por $arg.

Sintaxe

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

Argumentos

$arg
Sequência de itens cujos valores digitados serão retornados.

Comentários

As descrições a seguir aplicam-se a valores digitados:

  • O valor digitado de um valor atômico é o valor atômico.

  • O valor digitado de um nó de texto é o valor da cadeia de caracteres do nó de texto.

  • O valor digitado de um comentário é o valor da cadeia de caracteres do comentário.

  • O valor digitado de uma instrução de processamento é o conteúdo da instrução de processamento, sem o nome de destino da instrução de processamento.

  • O valor digitado de um nó de documento é seu valor de cadeia de caracteres.

As descrições a seguir aplicam-se a atributo e nós de elemento:

  • Se um nó de atributo é digitado com um tipo de esquema XML, seu valor digitado será o valor digitado.

  • Se o nó de atributo não for tipado, seu valor tipado será igual ao valor de cadeia de caracteres retornado como uma instância de xdt:untypedAtomic.

  • Se o nó de elemento não tiver sido digitado, seu valor tipado será igual ao valor de cadeia de caracteres retornado como uma instância de xdt:untypedAtomic.

As descrições a seguir aplicam-se a nós de elemento digitados:

  • Se o elemento tiver um tipo de conteúdo simples, data() retornará o valor digitado do elemento.

  • Se o nó for de tipo complexo, incluindo xs:anyType, data() retornará um erro estático.

Embora o uso da função data() seja frequentemente opcional, conforme mostrado nos exemplos a seguir, especificar a função data() aumenta explicitamente a legibilidade da consulta. Para obter mais informações, consulte Noções básicas do XQuery.

Não é possível especificar dados() em XML construído, conforme mostrado no seguinte:

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

Exemplos

Este tópico fornece exemplos XQuery em instâncias XML armazenadas em várias colunas de tipo xml no banco de dados AdventureWorks.

a. Usando a função data() XQuery para extrair valor com tipo de um nó

A consulta a seguir ilustra como a função data() é usada para recuperar valores de um atributo, um elemento e um nó de texto:

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  

Este é o resultado:

<Root ProductID="19" Feature="parts and labor"/>  

Conforme mencionado, a função data() é opcional quando você está construindo atributos. Se você não especificar a função data(), ela será implicitamente assumida. A consulta a seguir produz os mesmos resultados da consulta prévia:

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  

Os exemplos a seguir ilustram instâncias nas quais a função data() é necessária.

Na consulta a seguir, $pd/p1:Specifications/Material retorna o <Material> elemento . Além disso, data($pd/p1:Specifications/ Material) retorna dados de caractere digitado como xdt:untypedAtomic, pois <Material> não são tipado. Quando a entrada não é tipada, o resultado de data() é digitado como 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  

Este é o resultado:

<Root>  
  <Material>Almuminum Alloy</Material>Almuminum Alloy  
</Root>  

Na consulta a seguir, data($pd/p1:Features/wm:Warranty) retorna um erro estático, pois <Warranty> é um elemento de tipo complexo.

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  

Consulte Também

Funções XQuery em tipos de dados xml