sum 函数 (XQuery)

返回一列数字的和。

语法

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

参数

  • $arg
    要计算其和的一列原子值。

注释

传递给 sum() 的原子化值的所有类型都必须是同一基类型的子类型。接受的基类型为三种内置数字基类型或 xdt:untypedAtomic。类型为 xdt:untypedAtomic 的值将转换为 xs:double。如果这些类型混合在一起,或者传递了其他类型的其他值,则会引发静态错误。

在使用 xdt:untypedAtomic 的情况下,sum() 结果将接收传入类型(如 xs:double)的基类型,即使输入是空序列(可选)。如果输入在静态下为空,则对于 xs:integer 的静态和动态类型,结果都为 0。

sum() 函数返回数值的和。如果无法将 xdt:untypedAtomic 值转换为 xs:double,则在输入序列 $arg 中忽略该值。如果输入是动态计算的空序列,则返回的所用基类型的值为 0。

当发生溢出或超出范围异常时,函数将返回一个运行时错误。

示例

本主题提供了一些对 XML 实例的 XQuery 示例,这些实例存储在 AdventureWorks2008R2 数据库内不同的 xml 类型列中。有关这些列的概述,请参阅AdventureWorks2008R2 数据库中的 xml 数据类型表示形式

A. 使用 sum() XQuery 函数查找计算生产过程中所有生产车间的总工时

下面的查询查找在生产(已存储其生产说明的)所有产品型号的过程中所有生产车间的总工时。

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       

下面是部分结果:

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

您可以编写查询以生成关系结果,而不以 XML 形式返回结果,如下面的查询所示:

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        

下面是部分结果:

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

实现限制

限制如下:

  • 仅支持单参数版本的 sum()

  • 如果输入是动态计算的空序列,则返回的所用基类型(而不是 xs:integer 类型)的值为 0。

  • sum() 函数将所有整数映射到 xs:decimal。

  • 不支持对 xs:duration 类型的值使用 sum() 函数。

  • 不支持跨基类型边界混合类型的序列。

  • sum((xs:double(“INF”), xs:double(“-INF”))) 将引发域错误。