Atomisation (XQuery)

S’applique à :SQL Server

L'atomisation correspond au procédé d'extraction de la valeur typée d'un élément. Ce procédé s'applique cependant sous certaines conditions. Certains opérateurs XQuery, tels que les opérateurs arithmétiques et de comparaison, dépendent de ce processus. Par exemple, lorsque vous appliquez des opérateurs arithmétiques directement aux nœuds, la valeur typée d’un nœud est d’abord récupérée en appelant implicitement la fonction de données. Ceci permet de transférer la valeur atomique sous forme d'opérande à l'opérateur arithmétique.

Par exemple, la requête suivante renvoie le total des attributs LaborHours indiquant le nombre d'heures travaillées. Dans ce cas, data() est implicitement appliqué aux nœuds d’attribut.

declare @x xml  
set @x='<ROOT><Location LID="1" SetupTime="1.1" LaborHours="3.3" />  
<Location LID="2" SetupTime="1.0" LaborHours="5" />  
<Location LID="3" SetupTime="2.1" LaborHours="4" />  
</ROOT>'  
-- data() implicitly applied to the attribute node sequence.  
SELECT @x.query('sum(/ROOT/Location/@LaborHours)')  

Bien que ce ne soit pas obligatoire, vous pouvez également spécifier explicitement la fonction data() :

SELECT @x.query('sum(data(ROOT/Location/@LaborHours))')  

Un autre exemple d'atomisation implicite réside dans l'utilisation d'opérateurs arithmétiques. L’opérateur + requiert des valeurs atomiques, et data() est implicitement appliqué pour récupérer la valeur atomique de l’attribut LaborHours. La requête est spécifiée par rapport à la colonne Instructions du type xml dans la table ProductModel. La requête suivante renvoie trois fois l'attribut LaborHours. À ce sujet, vous remarquerez que :

  • Lors de la construction de l'attribut OriginalLaborHours, l'atomisation s'applique implicitement à la séquence singleton renvoyée par ($WC/@LaborHours). La valeur typée de l'attribut LaborHours est affectée à OriginalLaborHours.

  • Lors de la construction de l'attribut UpdatedLaborHoursV1, l'opérateur arithmétique requiert des valeurs atomiques. Par conséquent, data() est implicitement appliqué à l’attribut LaborHours retourné par ($WC/@LaborHours). La valeur atomique 1 lui est ensuite ajoutée. La construction de l’attribut UpdatedLaborHoursV2 montre l’application explicite de data(), mais n’est pas obligatoire.

SELECT Instructions.query('  
     declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";  
for $WC in /AWMI:root/AWMI:Location[1]  
        return  
            <WC OriginalLaborHours = "{ $WC/@LaborHours }"  
                UpdatedLaborHoursV1 = "{ $WC/@LaborHours + 1 }"   
                UpdatedLaborHoursV2 = "{ data($WC/@LaborHours) + 1 }" >  
            </WC>') as Result  
FROM Production.ProductModel  
where ProductModelID=7  

Voici le résultat obtenu :

<WC OriginalLaborHours="2.5"   
    UpdatedLaborHoursV1="3.5"   
    UpdatedLaborHoursV2="3.5" />  

L'atomisation entraîne donc une instance d'un type simple, un ensemble vide ou une erreur de type statique.

L’atomisation se produit également dans les paramètres d’expression de comparaison passés aux fonctions, les valeurs retournées par les fonctions, les expressions cast() et les expressions d’ordre passées dans la clause order by.

Voir aussi

Concepts de base de XQuery
expressions de comparaison (XQuery)
Fonctions XQuery impliquant le type de données xml