суббота, 13 июня 2009 г.

SQL-функция AVG вызывает переполнение (Arithmetic overflow error)

Такая неприятная вещь бывает даже в случае, когда надо посчитать среднее от довольно маленькой величины (например tinyint), но в большом массиве. Компания Майкрософт по этой ссылке говорит примерно следующее:
"...Мы расследовали эту проблему и даже придумали, как решить ее, но из-за нехватки ресурсов и времени мы не успеваем вставить решение в SQL 2008, так что ждите следующей версии..." - Разгильдяи, одним словом. Workaround по данной ссылке не описан.
Однако, другие умные люди нашли этот воркэраунд: предположим, что инструкция типа
SELECT AVG(bytessent)
вызывает ошибку Arithmetic overflow error. Перепишем ее как
SELECT AVG(CAST(bytessent AS bigint))
и все получится.

Источники:
http://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=241543
http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=75175

Комментариев нет: