主题:SQL语名查询出错:....发生算术溢出错误。
阿平~~
[专家分:170] 发布于 2006-11-20 17:46:00
select 300000/500*600000*8 from table1
运行查询后出错:
服务器: 消息 8115,级别 16,状态 2,行 1
将 expression 转换为数据类型 int 时发生算术溢出错误。
请问这是何故???
回复列表 (共7个回复)
沙发
菜鸭 [专家分:5120] 发布于 2006-11-21 09:18:00
select 300000*1.0/500*600000*8 from table1 即可
板凳
Leo64823900 [专家分:960] 发布于 2006-11-21 10:54:00
在 SQL Server 数据库中, 整数 (int) 的范围是
从 -2^31 (-2,147,483,648) 到 2^31-1 (2,147,483,647).
因 300000/500*600000*8 > 2,147,483,647 所以发生算术溢出错误。
解决算术溢出的方法是转换数据类型,再运算。1楼给出了一个常用的转换成浮点(float)的表达式。下面是一个转换成 decimal 的例子。
select cast(300000/500 as decimal)*600000*8
3 楼
wdkshp [专家分:5490] 发布于 2006-11-21 11:36:00
支持2楼
鼓掌!
4 楼
阿平~~ [专家分:170] 发布于 2006-11-21 13:43:00
谢谢大家的回贴先.
对不起我写错了,应该是:
select 300000/(500*600000*8) from table1 --(出错)
看了楼上2位朋友的回贴,我把它改为以下几种形式都不行啊:
select 300000*1.0/(500*600000*8*1.0) from table1
select 300000*1.0/cast(500*600000*8*1.0 as decimal) from table1
select cast(300000*1.0/cast(500*600000*8*1.0 as decimal) as decimal) from table1
5 楼
Leo64823900 [专家分:960] 发布于 2006-11-21 23:50:00
1) 请留意表达式的运算次序:表达式 300000/(500*600000*8) 首先运算 500*600000*8 其结果已超出整数 (int) 的范围。 因此必须在其运算前进行数据的类型转换。
2) 当不同类型的数据运算时, 结果为高精度的数据类型。如 整数*浮点数 结果是浮点数。
3)参照1)和2)就可写出无算术溢出的表达式。
6 楼
菜鸭 [专家分:5120] 发布于 2006-11-22 08:32:00
这主要是分母中的表达式超范围引起的
可改为
select 300000/(500*600000*(8*1.0)) from table1
即可
7 楼
阿平~~ [专家分:170] 发布于 2006-11-23 09:21:00
谢谢5楼Leo64823900兄的精辟分析,和6楼兄弟的实例演示!!!!!!
本人真是受益良多!!
谢谢所有回贴的兄弟们!!
我来回复