Compartir a través de


data (función de XQuery)

Devuelve el valor con tipo de cada uno de los elementos especificados por $arg.

Sintaxis

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

Argumentos

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

Notas

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 tiene tipo, su valor con tipo será igual a su valor de cadena, que se devuelve como una instancia de xdt:untypedAtomic.

  • Si al nodo de elemento no se le ha aplicado ningún tipo, su valor con tipo será 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() devolverá el valor con tipo del elemento.

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

Aunque el uso de la función data() suele ser opcional, tal y como se muestra en los siguientes ejemplos, si la función data() se especifica de forma explícita, mejora la legilibilidad de las consultas. Para obtener más información, consulte Conceptos básicos de XQuery.

No se puede especificar data() en XML generado, tal y como se muestra a continuación:

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

Ejemplos

En este tema se ofrecen ejemplos de consultas XQuery con instancias XML almacenadas en varias columnas de tipo xml en la base de datos AdventureWorks. Para obtener información general de cada una de estas columnas, vea Representación de tipo de datos xml en la base de datos AdventureWorks.

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

La siguiente consulta ilustra la forma de utilizar 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 ha mencionado anteriormente, la función data() es opcional cuando se crean atributos. Si no se especifica la función data(), se asume de forma implícita. 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 siguiente ejemplos se ilustran una serie de instancias en las que es necesaria la función data().

En la siguiente consulta, $pd/p1:Specifications/Material devuelve el elemento <Material>. Además, data($pd/p1:Specifications/ Material) devuelve los datos de carácter escritos en forma de xdt:untypedAtomic, puesto que <Material> no tiene ningún tipo. Cuando la entrada no tiene ningún tipo, el resultado de data() se escribe en forma de 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 siguiente consulta, data($pd/p1:Features/wm:Warranty) devuelve un error estático, ya que <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