Арифметическое переполнение в зависимости от группировки по столбцам
Я получаю эту ошибку, но только при группировке по определенным столбцам:
Arithmetic overflow error converting expression to data type int.
И я не могу уложить в голове, почему. Это запрос, вызывающий это (виновником является функция суммы):
SELECT a.AtgardAvvattningId,
a.ObjektId,
sum(p.SlutLopLangd - p.StartLopLangd) As TotalLangd
FROM AtgardAvvattning a
INNER JOIN Objekt o ON o.ObjektId = a.ObjektId
INNER JOIN Position p ON p.AvvattningAtgardId = a.AtgardAvvattningId
INNER JOIN Vna v ON v.PositionId = p.PositionId
WHERE v.OID IN (...)
GROUP BY a.AtgardAvvattningId, a.ObjektId, o.AtgardsDatum
ORDER BY a.ObjektId
p.SlutLopLangd и p.StartLopLangd являются столбцами int. Если я конвертирую значения в bigint перед суммированием, это работает:
sum(CONVERT(bigint, p.SlutLopLangd - p.StartLopLangd)) As TotalLangd
Давая этот результат:
И как бы вы ни суммировали строки, должно быть трудно достичь предела переполнения int.
1 ответ
Окончательное значение на самом деле не имеет значения. Что, вероятно, происходит, так это то, что в какой-то момент вы превышаете максимальное значение (2147 483 647) или минимальное значение (-2147 483 648) для и получаете ошибку.
Возьмите этот пример:
SELECT SUM(V.I)
FROM (VALUES(2147483646),
(2),
(-2006543543))V(I);
Это, вероятно, вызовет ту же ошибку:
Ошибка арифметического переполнения при преобразовании выражения в тип данных int.
Результат
SUM
однако будет 140940105 (значительно ниже максимума). Это потому , что если
2147483646
а также
2
сначала суммируются, то получается
2147483648
, что больше, чем максимальное значение
int
. если ты
CAST
/
CONVERT
сначала значение, вы не получите ошибку:
SELECT SUM(CONVERT(bigint,V.I))
FROM (VALUES(2147483646),
(2),
(-2006543543))V(I);