Saral S Stalin Ответов: 2

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


Привет эксперты,

Согласно моему пониманию NUMERIC(18, 10) столбец будет принимать 18 десятичных цифр слева от десятичной точки и 10 справа.

Одна из наших процедур начала выдавать ошибку "арифметического переполнения при преобразовании числового типа данных в числовой" для гораздо меньших значений. Я проверил документацию в msdn http://msdn.microsoft.com/en-us/library/ms187746.aspx[^] что также, кажется, говорит то же самое. Есть ли что-то, чего мне здесь не хватает?

Пример:

SELECT CAST(1234567891234567.34 AS NUMERIC(18,2))  --Works
SELECT CAST(1234567891234567.34 AS NUMERIC(18,10)) --fails with Arithmetic overflow error


Мы исправили эту проблему, изменив кастинг на NUMERIC(18, 2) но я хотел разобраться в проблеме немного глубже.

VJ Reddy

Спасибо тебе, Сарал со Сталин, за то, что принял решение :)

2 Ответов

Рейтинг:
10

VJ Reddy

Решение 1, данное Мехди Голам быть очень хорошим.

Я хочу добавить следующее, Так как ОП хочет конкретно знать, почему ошибка не была выброшена в первом случае и почему ошибка выброшена во втором случае.

Как видно из высказываний

SELECT CAST(1234567891234567.34 AS NUMERIC(18,2))  --Works
SELECT CAST(1234567891234567.34 AS NUMERIC(18,10)) --fails with Arithmetic overflow error

понятно, что в первом случае из утверждения NUMERIC(18,2) общее количество цифр равно 18, а 16 цифр доступны слева от десятичной дроби, тогда как 1234567891234567 это 16 цифр. Следовательно, ошибки нет.
Во втором случае из заявления NUMERIC(18,10), 8 цифр доступны слева от десятичной дроби, но 1234567891234567 это 16 цифр, что больше, чем 8 цифр. Следовательно, возникает арифметическая ошибка переполнения.


Mehdi Gholam

5 ЕД

VJ Reddy

Спасибо, Мехди.

Shashank Prasad

-- создание таблицы --
создать таблицу M_DCR_Refund
(
refund_id int IDENTITY (1,1) первичный ключ,
dcr_id int not null,

роялти числовое (18,2) не равно нулю,
РП числовые(2,2) не нуль,
stid int not null,
ст числовые(2,2) не нуль,
tdsid int not null,
ТДС числовые(2,2) не нуль,
froyalty numeric (2,2) not null,
возврат числовой (2,2) не нулевой,

refund_date дата не null,
refunded_by varchar(20) not null,
del_flag бита нулем
)
-- инструкция INSERT --
вставить в M_DCR_Refund (
dcr_id,роялти,РП Стид ст tdsid,ТДС,froyalty,возврат,refund_date,refunded_by) значения
(14,4.00,5.00,3,2.00,8,1.00,6.00,3.00,'2014-01-01','админ')

-- сообщение об ошибке--
Msg 8115, Уровень 16, Состояние 8, Строка 1
Ошибка арифметического переполнения при преобразовании numeric в тип данных numeric.
Заявление было прекращено.


Пожалуйста, предложите...

Рейтинг:
1

Mehdi Gholam

Читать это :
http://msdn.microsoft.com/en-us/library/ms187746.aspx[^]

NUMERIC (p, s): p означает как левую, так и правую часть десятичной дроби.

Как правило, вы не можете иметь большие числа и малые числа в одном и том же контексте (обработка миллионов долларов и отслеживание 1/10000 центов и т. д., Так как это не будет иметь никакого значения в этих масштабах).


Saral S Stalin

Привет, я понимаю ваши замечания. Но то, что я ищу, - это то, почему он выдает ошибку арифметического переполнения, когда этого не должно быть.

Mehdi Gholam

Будет выделено 10 десятичных знаков (проверьте, запросив таблицу), так что у вас останется только 8 знаков слева.

Ошибка предназначена для того, чтобы показать, что вы делаете что-то не так.

cdaraujo

Очень Хорошо!

VJ Reddy

Хороший ответ. 5!

Mehdi Gholam

Спасибо, ви-джей!