[英]Arithmetic overflow error converting numeric datatype to numeric
我在表中有以下各列
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
尝试这个。
SELECT SIZE,
PRICE,
CAST(SIZE*PRICE AS numeric(14,5))AS TOTAL
FROM TNAME
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
关于第一个问题,小数位数,没有错。 这是我们在学校学习的基本的日常乘法:将两个十进制数字相乘会产生一个数字,该数字的十进制数字与操作数的十进制数字之和一样多。 整数位数最多可以等于操作数的整数位数之和。
将10.11
乘以12.13
122.6343
。 如果SQL Server违反了此基本规则并任意截断了结果,那将非常尴尬。
结果,当您尝试将产品存储在接受较少数字的列中时,会出现溢出错误。 SQL Server不会自动更改位数,因为没有办法确定正确的操作。
您有很多方法可以解决此问题,具体取决于您愿意承受的精度损失:
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 在这里
假设数字位数不超过14,这将起作用,否则,您将不得不更改表格字段的类型。
如果要在SQL中进行其他四舍五入,则必须创建自己的函数。
在下面找到有用的链接。 数字的乘法按照此链接,您可以尝试如下查询
SELECT SIZE,
PRICE,
CAST(SIZE*PRICE AS numeric(28,5))AS TOTAL
FROM TNAME
尝试这个
SELECT SIZE,PRICE,CONVERT(numeric(14,5), SIZE*PRICE) AS TOTAL
FROM TNAME
在插入中写相同的查询,它必须工作
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.