Funciones del descriptor de acceso a datos: data (XQuery)

Se aplica a:SQL Server

Devuelve el valor con tipo de cada elemento especificado por $arg.

Sintaxis

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

Argumentos

$arg
Secuencia de elementos cuyos valores con tipo van a devolverse.

Comentarios

La siguiente información se aplica a los valores con tipo:

  • El valor con tipo de un valor atómico es el propio valor atómico.

  • El valor con tipo de un nodo de texto es el valor de cadena del nodo de texto.

  • El valor con tipo de un comentario es el valor de cadena del comentario.

  • El valor con tipo de una instrucción de procesamiento es el contenido de la instrucción de procesamiento, sin el nombre de destino de la instrucción de procesamiento.

  • El valor con tipo de un nodo de documento es su valor de cadena.

La siguiente información se aplica a los nodos de atributo y de elemento:

  • Si un nodo de atributo se escribe con un tipo de esquema XML, su valor con tipo será el valor con tipo en consecuencia.

  • Si el nodo de atributo no está escrito, su valor con tipo es igual a su valor de cadena que se devuelve como una instancia de xdt:untypedAtomic.

  • Si el nodo de elemento no se ha escrito, su valor con tipo es igual a su valor de cadena que se devuelve como una instancia de xdt:untypedAtomic.

La siguiente información se aplica a los nodos de elemento con tipo:

  • Si el elemento tiene un tipo de contenido simple, data() devuelve el valor con tipo del elemento.

  • Si el nodo es de tipo complejo, incluido xs:anyType, data() devuelve un error estático.

Aunque el uso de la función data() suele ser opcional, como se muestra en los ejemplos siguientes, la especificación de la función data() aumenta explícitamente la legibilidad de las consultas. Para obtener más información, consulte Conceptos básicos de XQuery.

No puede especificar data() en XML construido, como se muestra en lo siguiente:

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

Ejemplos

En este tema se proporcionan ejemplos de XQuery en las instancias XML almacenadas en varias columnas de tipo xml de la base de datos AdventureWorks.

A. Utilizar la función data() de XQuery para extraer el valor con tipo de un nodo

En la consulta siguiente se muestra cómo se usa la función data() para recuperar valores de un atributo, un elemento y un nodo 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  

El resultado es el siguiente:

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

Como se mencionó, la función data() es opcional al construir atributos. Si no especifica la función data(), se supone implícitamente. La siguiente consulta genera los mismos resultados que la consulta anterior:

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  

En los ejemplos siguientes se muestran instancias en las que se requiere la función data().

En la consulta siguiente, $pd/p1:Specifications/Material devuelve el <Material> elemento . Además, data($pd/p1:Specifications/ Material) devuelve datos de caracteres con tipo xdt:untypedAtomic, porque <Material> no está escrito. Cuando la entrada no está tipada, el resultado de data() se escribe 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  

El resultado es el siguiente:

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

En la consulta siguiente, data($pd/p1:Features/wm:Warranty) devuelve un error estático, porque <Warranty> es un elemento de tipo complejo.

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 también

Funciones de XQuery con el tipo de datos xml