Почему SQL Server выдает ошибку арифметического переполнения, конвертируя int в числовой тип данных? - PullRequest
64 голосов
/ 13 января 2010

Я получаю сообщение об ошибке SQL Server Management Studio при запуске этого кода:

declare @percentage numeric(3,2)
set @percentage = cast(15 as numeric(3,2))

но когда я изменяю числовое объявление на

declare @percentage numeric(4,2)
set @percentage = cast(15 as numeric(4,2))

все идет хорошо.

Есть ли ограничение для числового типа данных?

Ответы [ 4 ]

124 голосов
/ 13 января 2010

Числовое значение определяет ОБЩЕЕ количество цифр, а затем число после десятичного числа.

Числовой (3,2) может содержать только до 9,99.

27 голосов
/ 13 января 2010

Посмотрим, числовые (3,2). Это означает, что у вас есть 3 места для данных, и два из них находятся справа от десятичного знака, оставляя только одно слева от десятичного знака. 15 имеет два места слева от десятичной дроби. Кстати, если бы вы могли иметь значение 100, я бы увеличил его до числового (5, 2)

17 голосов
/ 13 января 2010

NUMERIC(3,2) означает: всего 3 цифры, 2 после десятичной точки.Таким образом, у вас есть только один десятичный знак перед десятичной точкой.

Попробуйте NUMERIC(5,2) - три до, два после десятичной точки.

16 голосов
/ 13 января 2010

Точность и масштаб часто понимают неправильно. В числовом (3,2) вы хотите 3 цифры в целом, но 2 справа от десятичной. Если вы хотите 15 => 15.00, то первая цифра 1 вызывает переполнение (поскольку если вы хотите, чтобы 2 цифры были справа от десятичной дроби, слева осталось место только для одной цифры). С 4,2 проблем нет, потому что подходят все 4 цифры.

...