Fonction data (XQuery)

Renvoie la valeur typée pour chaque élément spécifié par $arg.

Syntaxe

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

Arguments

  • $arg
    Séquence d'éléments dont les valeurs typées seront renvoyées.

Notes

Les points suivants s'appliquent aux valeurs typées :

  • La valeur typée d'une valeur atomique est la valeur atomique.

  • La valeur typée d'un nœud de texte est la valeur chaîne du nœud de texte.

  • La valeur typée d'un commentaire est la valeur de chaîne du commentaire.

  • La valeur typée d'une instruction de traitement est le contenu de l'instruction de traitement sans le nom cible de l'instruction de traitement.

  • La valeur typée d'un nœud de document est sa valeur de chaîne.

Les points suivants s'appliquent aux nœuds d'attribut et d'élément :

  • Si un nœud d'attribut est typé avec un type de schéma XML, sa valeur typée est la valeur typée correspondante.

  • Si le nœud d'attribut est non typé, sa valeur typée est égale à sa valeur de chaîne qui est renvoyée sous forme d'une instance de xdt:untypedAtomic.

  • Si le nœud d'élément n'a pas été typé, sa valeur typée est égale à sa valeur de chaîne qui est renvoyée sous forme d'une instance de xdt:untypedAtomic.

Les points suivants s'appliquent aux nœuds d'élément typés :

  • Si l'élément contient un seul type de contenu, data() renvoie la valeur typée de l'élément.

  • Si le nœud est de type complexe, notamment xs:anyType, data() renvoie une erreur statique.

Bien que la fonction data() soit souvent facultative, comme le montrent les exemples suivants, l'utilisation de la fonction data() augmente notablement la lisibilité de la requête. Pour plus d'informations, consultez Concepts de base de XQuery.

Vous ne pouvez pas spécifier data() sur du code XML construit, comme le montre l'exemple suivant :

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

Exemples

Cette rubrique propose des exemples de XQuery relatifs à des instances XML stockés dans différentes colonnes de type xml tirées de la base de données AdventureWorks2008R2. Pour obtenir une vue d'ensemble de chacune de ces colonnes, consultez Représentation du type de données xml dans la base de données AdventureWorks2008R2.

A. Utilisation de la fonction XQuery data() pour extraire la valeur typée d'un nœud

La requête suivante explique comment utiliser la fonction data() pour récupérer les valeurs d'un attribut, d'un élément et d'un nœud de texte :

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

Voici le résultat obtenu :

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

Comme expliqué, la fonction data() est facultative lors de la construction des attributs. Si vous ne spécifiez pas la fonction data(), elle est implicitement sous-entendue. La requête suivante produit les mêmes résultats que la précédente :

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;

Les exemples suivants présentent des instances dans lesquelles la fonction data() est obligatoire.

Dans la requête suivante, $pd/p1:Specifications/Material renvoie l'élément <Material>. De plus, data($pd/p1:Specifications/ Material) renvoie des données caractères typées sous xdt:untypedAtomic, car <Material> est non typé. Lorsque l'entrée est non typée, le résultat de data() est typé en tant que 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;

Voici le résultat obtenu :

<Root>

<Material>Almuminum Alloy</Material>Almuminum Alloy

</Root>

Dans la requête suivante, data($pd/p1:Features/wm:Warranty) renvoie une erreur statique car <Warranty> est un élément de type complexe.

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;