Fonction sum (XQuery)

Retourne la somme d'une série de nombres.

Syntaxe

fn:sum($arg as xdt:anyAtomicType*) as xdt:anyAtomicType

Arguments

  • $arg
    Série de valeurs atomiques dont la somme est à calculer.

Notes

Tous les types des valeurs atomiques transmises à sum() doivent être des sous-types du même type de base. Les types de base acceptés sont les trois types de base numériques intégrés ou xdt:untypedAtomic. Les valeurs de type xdt:untypedAtomic sont converties en valeurs xs:double. S'il existe un mélange de ces types ou si d'autres valeurs d'autres types sont transmises, une erreur statique est générée.

Le résultat de sum() reçoit le type de base des types transmis, tel que xs:double dans le cas de xdt:untypedAtomic, même si l'entrée correspond éventuellement à une série vide. Si l'entrée est vide statiquement, le résultat est 0 avec le type statique et dynamique de xs:integer.

La fonction sum() retourne la somme des valeurs numériques. Si une conversion d'une valeur xdt:untypedAtomic en xs:double ne peut pas être effectuée, la valeur est ignorée dans la séquence en entrée, $arg. Si l'entrée est une séquence vide calculée dynamiquement, la valeur 0 du type de base utilisé est retournée.

La fonction retourne une erreur d'exécution en cas d'exception de dépassement de capacité ou de valeur hors limite.

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 AdventureWorks2008R2. Pour obtenir une vue d'ensemble de chaque colonne, consultez Représentation du type de données xml dans la base de données AdventureWorks2008R2.

A. Utilisation de la fonction XQuery sum() pour rechercher le nombre total d'heures de travail pour tous les ateliers inclus dans le processus de fabrication

La requête ci-dessous permet de trouver le nombre total d'heures de travail pour tous les ateliers inclus dans le processus de fabrication de tous les modèles de produits pour lesquels des instructions de fabrication sont stockées.

SELECT Instructions.query('       
   declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";       
  <ProductModel PMID= "{ sql:column("Production.ProductModel.ProductModelID") }"       
  ProductModelName = "{ sql:column("Production.ProductModel.Name") }" >       
   <TotalLaborHrs>       
     { sum(//AWMI:Location/@LaborHours) }       
   </TotalLaborHrs>       
 </ProductModel>       
    ') as Result       
FROM Production.ProductModel       
WHERE Instructions is not NULL       

Le résultat partiel est le suivant.

<ProductModel PMID="7" ProductModelName="HL Touring Frame">
   <TotalLaborHrs>12.75</TotalLaborHrs>
</ProductModel>
<ProductModel PMID="10" ProductModelName="LL Touring Frame">
  <TotalLaborHrs>13</TotalLaborHrs>
</ProductModel>
...

Au lieu de retourner le résultat au format XML, vous pouvez écrire la requête pour générer des résultats relationnels, comme l'illustre la requête suivante :

SELECT ProductModelID,       
        Name,       
        Instructions.value('declare namespace 
      AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";       
    sum(//AWMI:Location/@LaborHours)', 'float') as TotalLaborHours       
FROM Production.ProductModel       
WHERE Instructions is not NULL        

Voici un résultat partiel :

ProductModelID Name                 TotalLaborHours       
-------------- -------------------------------------------------
7              HL Touring Frame           12.75                 
10             LL Touring Frame           13                    
43             Touring Rear Wheel         3                     
...

Limitations d'implémentation

Vous trouverez les limitations ci-dessous :

  • Seule la version à un seul argument de sum() est prise en charge.

  • Si l'entrée est une séquence vide calculée dynamiquement, la valeur 0 du type de base utilisé est retournée à la place du type xs:integer.

  • La fonction sum() mappe tous les entiers à xs:decimal.

  • La fonction sum() n'est pas prise en charge sur des valeurs de type xs:duration.

  • Les séquences qui mélangent des types en dehors des limites des types de base ne sont pas prises en charge.

  • L'expression sum((xs:double(“INF”), xs:double(“-INF”))) génère une erreur de domaine.