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