Статьи Ошибки Сообщение 1С при работе с MS SQL Server 2005/2008: Arithmetic overflow error converting numeric to data type numeric.

Сообщение 1С при работе с MS SQL Server 2005/2008: Arithmetic overflow error converting numeric to data type numeric.

18.04.2011 16:48 Администратор
Печать PDF

В работе клиент серверной 1С иногда появляется сообщение:
Ошибка выполнения запроса
по причине:
Ошибка при выполнении операции над данными:
Microsoft OLE DB Provider for SQL Server: Arithmetic overflow error converting numeric to data type numeric.
HRESULT=80040E57, SQLSrvr: SQLSTATE=22003, state=8, Severity=10, native=8115, line=1
Если данная ошибка появляется под управлением  MS SQL 2000, то рекомендуется проверить и установить обновление SP до SP4.
Но для SQL 2005 и 2008 появление такой ошибки не решается обновлением сервиспака.
Вообще появление указанной ошибки вызвано ошибкой в MS SQL при выполнении операции округления, например:
ROUND(9.5,0)
ROUND(9.6,0)
ROUND(99.5,0)
ROUND(999.5,0)
ROUND(9999.5,0)
ROUND(-9.5)
Касательно 1С и запросов выполняемых в ней, указанная ошибка может появляться при выполнении команды:
ВЫРАЗИТЬ(ЕСТЬNULL(ВремяПоГрафикуВЧасахНорма, 0) КАК ЧИСЛО(5, 2)) КАК WorkingHours
Если в качестве операнда будет число со значением после запятой .5, в этом случае SQL считает/разбирает значение как литерал х.5 и преобразует к данным типа Numeric(2,1).
Функция ROUND (округления)  отрабытывает правильно получая округленный результат и затем пытается сохранить как данные в формате Numeric(2,1), что не правильно и мы получаем сообщение "arithmetic overflow".
Если у Вас возникает такая ошибка, то попробуете использвать преобразование:

ВЫРАЗИТЬ(ЕСТЬNULL(ВремяПоГрафикуВЧасахНорма, 0) КАК ЧИСЛО(  {НОВОЕ значение} , 2)) КАК WorkingHours


ГДЕ {НОВОЕ значение} - Это увеличенное на один (несколько) разряд значение, в это случае ошибки не будет возникать.

Автор решения: © Александр Шарафан

(Информация с ресурса http://gilev.blogspot.com)

Обновлено 18.04.2011 17:01

Комментарии  

 
0 #1 Александр Шарафан 21.12.2011 16:05
Надо бы уточнить, что тип должен быть как NUMERIC (m,n) и NUMERIC (d,n), где m - разрядность исходная, а d- разрядность увеличенная, т.е. d = (m + k)
Цитировать
 
lavelin.ru