Atomisation (XQuery)

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, si vous appliquez des opérateurs arithmétiques directement aux nœuds, la valeur typée d'un nœud est tout d'abord récupérée par l'appel implicite à 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() s'applique de façon implicite aux nœuds de l'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 cela ne soit pas nécessaire, vous pouvez indiquer de façon explicite 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 ; la fonction data() s'applique de façon implicite afin de retrouver la valeur atomique de l'attribut LaborHours. La requête porte sur la colonne de type xml intitulée Instructions et provenant de 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. Ainsi, data() s'applique implicitement à l'attribut LaborHours renvoyé par « $WC/@LaborHours ». La valeur atomique 1 lui est ensuite ajoutée. La construction de l'attribut UpdatedLaborHoursV2 affiche l'application explicite de la fonction data(), mais ne la requiert pas pour autant.

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'expressions de comparaison transférés à des fonctions, dans les valeurs renvoyées par des fonctions, dans les expressions cast() et dans les expressions de tri transmises dans l'ordre établi par une clause.