Função data (XQuery)

Retorna o valor digitado de 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 é digitado, seu valor digitado é igual a seu valor de cadeia de caracteres que é retornado como uma instância xdt:untypedAtomic.

  • Se o nó de elemento não foi digitado, seu valor digitado é igual a seu valor de cadeia de caracteres que é retornado como uma instância 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, inclusive xs:anyType, data() retornará um erro estático.

Embora o uso da função data() seja muitas vezes opcional, como mostrado nos exemplos a seguir, especificar a função data() explicitamente aumenta a legibilidade da consulta. Para obter mais informações, consulte Fundamentos de XQuery.

Você não pode especificar data() em XML construído, do seguinte modo:

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

Exemplos

Este tópico fornece exemplos de XQuery em instâncias XML armazenadas em várias colunas do tipo xml no banco de dados AdventureWorks2008R2. Para obter uma visão geral de cada uma dessas colunas, consulte Representação de tipo de dados xml no banco de dados do AdventureWorks2008R2.

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

A consulta a seguir ilustra como a função data() é usada para recuperar valores de um atributo, elemento ou 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"/>

Como mencionado, a função data() é opcional quando você está construindo atributos. Se você não especificar a função data(), ela é assumida implicitamente. 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 em que a função data() é necessária.

Na consulta a seguir, $pd/p1:Specifications/Material retorna o elemento <Material>. Além disso, data($pd/p1:Specifications/ Material) retorna dados de caracteres digitados como xdt:untypedAtomic, pois <Material> não é digitado. Quando a entrada não for digitada, o resultado de data() será 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 do 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

Referência