Fonctions d’accesseur de données : data (XQuery)
S’applique à :SQL Server
Retourne 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.
Remarques
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 n’est pas typé, sa valeur typée est égale à sa valeur de chaîne retournée en tant qu’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 retournée en tant qu’instance de xdt:untypedAtomic.
Les points suivants s'appliquent aux nœuds d'élément typés :
Si l’élément a un type de contenu simple, data() retourne la valeur typée de l’élément.
Si le nœud est de type complexe, y compris xs:anyType, data() retourne une erreur statique.
Bien que l’utilisation de la fonction data() soit fréquemment facultative, comme illustré dans les exemples suivants, la spécification de la fonction data() augmente explicitement la lisibilité des requêtes. Pour plus d’informations, consultez Notions de base de XQuery.
Vous ne pouvez pas spécifier data() sur le code XML construit, comme indiqué dans les éléments suivants :
declare @x xml
set @x = ''
select @x.query('data(<SomeNode>value</SomeNode>)')
Exemples
Cette rubrique fournit des exemples XQuery sur des instances XML stockées dans différentes colonnes de type xml dans la base de données AdventureWorks.
R. Utilisation de la fonction XQuery data() pour extraire la valeur typée d'un nœud
La requête suivante montre comment la fonction data() est utilisée 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 mentionné précédemment, la fonction data() est facultative lorsque vous construisez des attributs. Si vous ne spécifiez pas la fonction data(), elle est implicitement supposée. 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 illustrent les instances dans lesquelles la fonction data() est requise.
Dans la requête suivante, $pd/p1:Specifications/Material retourne l’élément <Material
> . En outre, data($pd/p1:Specifications/ Material) retourne les données de caractères typées sous la forme xdt:untypedAtomic, car <Material
> n’est pas typé. Lorsque l’entrée n’est pas typée, le résultat de data() est tapé comme 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) retourne 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