Функция sum (XQuery)

Возвращает сумму последовательности чисел.

Синтаксис

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

Аргументы

  • $arg
    Последовательность атомарных значений, сумма которых должна быть вычислена.

Замечания

Все типы значений, передаваемых функции sum(), должны быть подтипами того же самого базового типа. Базовые типы, которые принимаются, — это три встроенных числовых базовых типа или тип xdt:untypedAtomic. Значения типа xdt:untypedAtomic приводятся к типу xs:double. Если передана смесь из этих типов или в последовательности обнаружены значения других типов, возникает статическая ошибка.

Результат выполнения функции sum() получает базовый тип переданных типов, например тип xs:double для типа xdt:untypedAtomic, даже если на входе — пустая последовательность. Если вход статически пуст, результатом будет значение 0 со статическим и динамическим типом xs:integer.

Функция sum() возвращает сумму числовых значений. Если значение типа xdt:untypedAtomic не может быть приведено к типу xs:double, во входной последовательности $arg оно пропускается. Если вход — это динамически вычисленная пустая последовательность, будет возвращено значение 0 используемого базового типа.

Функция возвращает ошибку времени выполнения, если происходит переполнение или исключение выхода за пределы диапазона.

Примеры

В этом подразделе приведены примеры запросов XQuery к экземплярам XML-документов, которые хранятся в различных столбцах типа xml в базе данных База данных AdventureWorks2008R2. Обзор каждого из этих столбцов см. в разделе Представление типов данных XML в базе данных AdventureWorks2008R2.

А. Использование функции языка XQuery sum(), чтобы найти полное количество рабочих часов для всех расположений цехов в производственном процессе

Следующий запрос находит общее количество трудовых часов для всех расположений цехов в производственном процессе всех моделей продукта, для которых сохранены производственные команды.

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() с одним аргументом.

  • Если вход — это динамически вычисленная пустая последовательность, будет возвращено значение 0 используемого базового типа вместо типа xs:integer.

  • Функция sum() сопоставляет все целые числа типу xs:decimal.

  • Функция sum() не поддерживает значения типа xs:duration.

  • Не поддерживаются последовательности, в которых смешиваются типы на основе разных базовых типов.

  • Выражение sum((xs:double("INF"), xs:double("-INF"))) вызывает ошибку домена.

См. также

Справочник