Partager via


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 retourne le total des LaborHours attributs. Dans ce cas, data() elle est implicitement appliquée aux nœuds d’attribut.

DECLARE @x AS 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 qu’il ne soit pas obligatoire, vous pouvez également spécifier explicitement la data() fonction :

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 retourne l’attribut LaborHours trois fois. Dans la requête, tenez compte des éléments suivants :

  • Lors de la construction de l’attribut, l’atomisation OriginalLaborHours est implicitement appliquée à la séquence singleton retourné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 nécessite 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 affiche l’application explicite de data(), mais n’est pas nécessaire.

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 :

<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, valeurs retournées par les fonctions, cast() expressions et expressions de classement passées dans la clause order by.