2013-12-13 7 views
0

Я имею следующие столбцы в таблицеарифметическая ошибка переполнения преобразования числового типа данных в цифровой

SIZE NUMERIC(14,5)  
PRICE NUMERIC(14,5)  

, когда я выполняю этот select запрос,

SELECT SIZE, 
PRICE, 
SIZE*PRICE AS TOTAL 
FROM TNAME 

я получаю результаты:

1.00000 90.00000 90.0000000000 
1.00000 90.00000 90.0000000000 
1.00000 90.00000 90.0000000000 
1.00000 100.00000 100.0000000000 
1.00000 30.00000 30.0000000000 

Мне интересно, почему третий столбец возвращается с 10 цифрами после десятичной точки ?

Также я получаю

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

при вставке результата в другую таблицу, которая имеет те же столбцы с одного типа данных

INSERT INTO TNAME2(SIZE, PRICE, TOTAL) 
    SELECT 
     SIZE, PRICE, SIZE * PRICE AS TOTAL 
    FROM 
     TNAME 
+2

_ Интересно, почему третий столбец возвращается с 10 цифрами после десятичной точки? _ То что это должно быть? –

+0

Продукт из двух факторов логически приведет к более высокой точности. Если вы его обходите, вы можете потерять информацию. –

ответ

1

Попробуй это.

SELECT SIZE, 
PRICE, 
CAST(SIZE*PRICE AS numeric(14,5))AS TOTAL 
FROM TNAME 
+0

пробовал это уже .. по-прежнему сохраняется ошибка – user3085995

+0

Ошибка при вставке проверяет определение таблицы как таблицы TNAME2 & TName. – Snehal

+0

@Snehal: пожалуйста, свяжитесь с моим редактированием. Третий столбец недоступен в 'TNAME', это вычисляемый столбец, значение которого я хочу вставить в столбе стол' TNAME2' 'TOTAL NUMERIC (15,5)' – user3085995

0

Получено ниже полезной ссылки. Multiplication of numerics По этой ссылке вы можете попробовать, как запрос, как показано ниже

SELECT SIZE, 
PRICE, 
CAST(SIZE*PRICE AS numeric(28,5))AS TOTAL 
FROM TNAME 
0

Попробуйте

SELECT SIZE,PRICE,CONVERT(numeric(14,5), SIZE*PRICE) AS TOTAL 
FROM TNAME 

Написать один и тот же запрос в вставки, он должен работать

1
INSERT INTO TNAME2 
SELECT SIZE , 
Price , 
CAST(SIZE * PRICE AS NUMERIC(15, 5)) 
FROM  TNAME 

ИЛИ

INSERT INTO TNAME2 (SIZE,Price,TOTAL) 
SELECT SIZE , 
Price , 
CAST(SIZE * PRICE AS NUMERIC(15, 5)) AS TOTAL 
FROM  TNAME 
1

Относительно первого вопроса, числа десятичных знаков, нет ничего плохого. Это основное, каждодневное умножение, которое мы изучаем в школе: умножение двух десятичных чисел дает число с таким количеством десятичных цифр, как сумма десятичных цифр операндов. Число целых цифр может быть до суммы целых цифр операндов.

Умножение 10.11 на 12.13122.6343. Было бы очень неудобно, если бы SQL Server нарушил это основное правило и произвольно урезал результат.

В результате при попытке сохранить продукт в столбце, который принимает меньшее количество цифр, вы получаете ошибку переполнения. SQL Server не будет автоматически изменять количество цифр, потому что нет способа решить правильное действие.

Есть целый lot of ways вы можете справиться с этим, в зависимости от потери точности вы готовы страдать:

  • Обрезать лишние цифры, то есть выбросить их, принимая до потери единицы. Это может стать большим количеством денег, если вы храните итоговые суммы.
  • Круглый до нужного количества цифр. Звучит интуитивно, но как насчет полутоновых значений, то есть 0,00005 в вашем случае? Должно ли оно 0,0001 или 0,0000?Таким образом, мы имеем
  • Округление, где 0,5 становится 1, в результате чего до .5 потери на запись
  • вниз, когда он становится равным 0, с той же потерей
  • Круглом к ​​четным или нечетным, где круглый к ближайшее нечетное или четное число, которое в среднем дает минимальные потери. Хотя это звучит странно, это - это стандарт, определенный в IEEE 754. Он также называется banker's rounding, потому что он используется в бухгалтерском учете, чтобы минимизировать потери из-за усечения.

Если вы хотите сохранить меньшее количество цифр, вам нужно решить, нужно ли урезать лишние цифры или как округлить число, а затем сделать это самостоятельно в коде.

В вашем случае вы можете использовать CAST с точностью до нужной точности. Это будет выполнять округление половину вверх, где 0,00005 становится 0.0001, например:

INSERT INTO TNAME2(SIZE, PRICE, TOTAL) 
SELECT 
    SIZE, PRICE, CAST(SIZE * PRICE as numeric(14,5)) AS TOTAL 
FROM 
    TNAME 

SQLFiddle here

Это будет работать, если количество цифр не превышает 14, в противном случае вам придется изменить тип вашего поля таблицы.

Если вам нужен другой тип округления в SQL, вам нужно будет создать свою собственную функцию.

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