2011-12-15 3 views
1

Так просто чтобы дать вам пример того, как наша процедура будет в конечном счете работать с данными и прийти с этой ошибкой, вот некоторые SQL:Ошибка арифметического переполнения в SQL

DECLARE @daysInPeriod INT 
DECLARE @dcFraction DECIMAL(38,38) 
DECLARE @YEAR_360   DECIMAL 
SET @YEAR_360 = 360.0000000000 
SET @daysInPeriod = DATEDIFF(dd, '12/24/1970', '6/29/07') 
SET @dcFraction = @daysInPeriod/@YEAR_360 

Если вы запустите в SQL Server 2008 R2, вы увидите, что вы получили сообщение об ошибке 'Arithmetic overflow error converting numeric to data type numeric.'.

decimal, что я устанавливаю значение max'd out с точки зрения мест, которые он может удерживать, что я считаю 38. Я не знаю, что еще я могу сделать, чтобы получить это значение. Разве вы не можете разделить integer на decimal в SQL и получить что-то из него, особенно если decimal является max'd?

ответ

7

В вашем примере значение @daysInPeriod/@YEAR_360: 37.0444444444444444444. Таким образом, вы не можете присвоить это значение параметру типа данных DECIMAL(38,38), так как вы не оставляете номер внутри. A DECIMAL(38,38) означает, что вы можете хранить 38 цифр, а 38 из них находятся в десятичной части, поэтому любое значение, превышающее 0.999999999999, выдаст ошибку.

+0

Ого, я, вероятно, следует из посмотрел десятичную декларацию первыми. Это уже было в коде, поэтому я неправильно предположил, что он был написан правильно в первый раз. Благодаря! – slandau

+1

@slandau Да, вы, вероятно, должны, но все это происходит со всеми нами, когда мы работаем с другим кодом людей на незнакомом языке, мы предполагаем, что другой парень знал, что он делает. –

1

Проблема заключается в вашей декларации @dcFraction как DECIMAL(38,38). Вы говорите, что хотите все 38 цифр справа от десятичной точки, без места для целой части слева.

1

Если вы даете вашему десятичной меньший масштаб, это будет работать:

DECLARE @daysInPeriod INT 
DECLARE @dcFraction DECIMAL(38,12) 
DECLARE @YEAR_360   DECIMAL 
SET @YEAR_360 = 360.0000000000 
SET @daysInPeriod = DATEDIFF(dd, '12/24/1970', '6/29/07') 
SET @dcFraction = @daysInPeriod/@YEAR_360 
select @dcFraction 

Это возвращает 37.044444444444

Смежные вопросы