sum (función de XQuery)

Devuelve la suma de una secuencia de números.

Sintaxis

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

Argumentos

  • $arg
    Secuencia de valores atómicos cuya suma se va a calcular.

Comentarios

Todos los tipos de valores atómicos que se pasan a sum() deben ser subtipos del mismo tipo base. Los tipos base aceptados son los tres tipos numéricos base integrados o xdt:untypedAtomic. Los valores de tipo xdt:untypedAtomic se convierten en xs:double. Si hay un mezcla de estos tipos, o si se pasan otros valores de otros tipos, se produce un error estático.

El resultado de sum() recibe el tipo base de los tipos pasados, como xs:double en el caso de xdt:untypedAtomic, aunque la entrada sea, opcionalmente, una secuencia vacía. Si se trata de una entrada vacía estática, el resultado es 0 con el tipo estático y dinámico xs:integer.

La función sum() devuelve la suma de los valores numéricos. Si un valor xdt:untypedAtomic no puede convertirse en xs:double, el valor se omite en la secuencia de entrada, $arg. Si la entrada es una secuencia vacía calculada dinámicamente, se devuelve el valor 0 del tipo base utilizado.

La función devuelve un error en tiempo de ejecución cuando se produce una excepción por desbordamiento o por valores fuera del intervalo.

Ejemplos

En este tema se proporcionan ejemplos de XQuery con instancias XML almacenadas en varios tipos de columnas xml de la base de datos de AdventureWorks2008R2. Para obtener información general de cada una de estas columnas, consulte Representación de tipo de datos xml en la base de datos AdventureWorks2008R2.

A. Utilizar la función sum() de XQuery para calcular el número total de horas de trabajo de todos los centros de trabajo del proceso de fabricación

La consulta siguiente averigua el número total de horas de trabajo para todos los centros de trabajo del proceso de fabricación de todos los modelos de producto para los que se almacenan instrucciones de fabricación.

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       

El resultado parcial es el siguiente.

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

En lugar de obtener el resultado como XML, puede escribir la consulta de manera que genere resultados relacionales, como la consulta siguiente:

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        

Éste es un resultado parcial:

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

Limitaciones de la implementación

Éstas son las limitaciones:

  • Sólo se admite la versión de sum() de un solo argumento.

  • Si la entrada es una secuencia vacía calculada dinámicamente, se devuelve el valor 0 del tipo base utilizado, en lugar del tipo xs:integer.

  • La función sum() asigna todos los valores enteros a xs:decimal.

  • No se admite la función sum() en valores de tipo xs:duration.

  • No se admiten secuencias que mezclan tipos entre los límites del tipo base.

  • sum((xs:double(“INF”), xs:double(“-INF”))) genera un error de dominio.