Ошибка арифметического переполнения при преобразовании varchar в десятичный тип данных

#sql #sql-server #sqldatatypes

Вопрос:

Я пытаюсь преобразовать varchar(14) в десятичный(14,2). Мой код что-то вроде

 Declare @varchar_variable varchar(14), @decimal_variable decimal(14,2)

Set @varchar_variable = '189'

Select @decimal_variable = Convert(Decimal(14,2),@varchar_variable)
 

Я получаю сообщение об ошибке арифметического переполнения только тогда, когда значение @varchar_variable велико (например, «10000000000189»).

Почему я получаю это сообщение об ошибке для больших значений ? Являются ли такие значения, как 10000000000189, недоступными для десятичного типа данных ? Если да, то каков диапазон десятичного типа данных в SQL.

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

1.Потому '10000000000189' что слишком велик… Самое большое значение, которое вы можете сохранить в a decimal(14,2) , составляет 999 999 999 999,99; ваше число (10 000 000 000 189) примерно в 100 раз больше этого.

2. Привет @Ankit Aakash, десятичное число(14, 2) означает, что вы ожидаете числа длиной 14 цифр, из которых две цифры зарезервированы для места после десятичного разделителя. Таким образом, наибольшее число, которое вы ожидаете, составляет 999999999999,99 . Как вы можете видеть, перед десятичным разделителем находится 12 цифр, а после-2 цифры. Число, вызывающее у вас проблемы, равно 10000000000189,00, и это число содержит 14 цифр до и 2 цифры после десятичного разделителя.

3. A DECIMAL(27, 13) -это наименьший тип, который может содержать все возможные значения в a VARCHAR(14) : 14 цифр без разделителя цифр и 13 с (и без начального нуля). Конечно, на практике вы можете не столкнуться со значениями, требующими такой точности, обязательно проверьте-объявление десятичных знаков с слишком большой точностью может привести к проблемам округления позже, когда они будут задействованы в вычислениях.

Ответ №1:

Вам нужно определить десятичное число(16,2), чтобы преобразовать varchar(14) в десятичное. Вы также можете использовать приведение вместо преобразования.

 Declare @varchar_variable varchar(14), @decimal_variable decimal(16,2)

Set @varchar_variable = '10000000000189'


Select @decimal_variable = CAST(@varchar_variable AS DECIMAL(16,2))

-- Select @decimal_variable = Convert(Decimal(16,2),@varchar_variable)

SELECT @decimal_variable
 

Ответ №2:

Как упоминалось в комментариях, Decimal(14,2) содержит в общей сложности 14 цифр.

Попробуйте увеличить размер переменной;

 Select Convert(Decimal(16,2),'10000000000189')