Функция 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 в базе данных AdventureWorks. Обзор каждого из этих столбцов см. в разделе Представление типов XML-данных в базе данных AdventureWorks.
А. Использование функции языка 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"))) вызывает ошибку домена.