SQLSERVR 转换为数字类型numeric时出现算数溢出错误
情况一
在SQLSERVER中,关于数据的计算可能会导致出现如下的错误
遇到这类问题,一般都是由于结果超过了这个字段的长度
个字段的属性的概念。
create table T1
(
F1 numeric(6,4)
)
其中:
“4”代表是小数位数;
“6”代表的是小数+整数位数
所以,整数位数=6-4=2位
所以正常情况下,当超过3位的整数位数的值更新(插入、修改)到字段中了就会报溢出
此类情况是针对表级别的,遇到这类情况,可以先看看计算结果再对比一下数据库表结构就可以发现问题并针对解决
情况二
当然,这里再提一个有意思的问题,那就是跟表字段没有关系,如下
SELECT ROUND(0.97,1)
执行也会提示转为数据类型numeric时出现算术溢出错误,原因就是。
当你直接输入一个0.97的以后,数据库会默认他的属性为numeric(2,2)
而当进行了ROUND(四舍五入)操作后,原本的结果应该为1.0,对应的字段属性就变为了numeric(2,1),虽然整体的长度没变,但是整数位数就变大了,导致整数部分溢出。
字段类型长度 | 总长度 | 小数位数 | 整数位数 |
---|---|---|---|
源字段 Numeric(2,2) | 2 | 2 | 0 |
目标字段 Numeric(2,1) | 2 | 1 | 1 |
目标字段长度大于源字段
如果要解决这种问题,那就需要我们解决数据库给这数据定义的默认属性
SELECT ROUND(CONVERT(numeric(3,2),0.97),1)
字段类型长度 | 总长度 | 小数位数 | 整数位数 |
---|---|---|---|
源字段 Numeric(3,2) | 3 | 2 | 1 |
目标字段Numeric(2,1) | 2 | 1 | 1 |
目标字段长度小于源字段
问题得到解决,所以在sqlserver中拼接sql,要留意是否有类似的情况