回 帖 发 新 帖 刷新版面

主题:SQL语名查询出错:....发生算术溢出错误。

select 300000/500*600000*8 from table1

运行查询后出错:
服务器: 消息 8115,级别 16,状态 2,行 1
将 expression 转换为数据类型 int 时发生算术溢出错误。

请问这是何故???

回复列表 (共7个回复)

沙发

select 300000*1.0/500*600000*8 from table1 即可

板凳

在 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 楼

支持2楼

鼓掌!

4 楼

谢谢大家的回贴先.

对不起我写错了,应该是:
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 楼

1) 请留意表达式的运算次序:表达式 300000/(500*600000*8) 首先运算 500*600000*8 其结果已超出整数 (int) 的范围。 因此必须在其运算前进行数据的类型转换。
2) 当不同类型的数据运算时, 结果为高精度的数据类型。如 整数*浮点数 结果是浮点数。
3)参照1)和2)就可写出无算术溢出的表达式。 


6 楼

这主要是分母中的表达式超范围引起的
可改为
select 300000/(500*600000*(8*1.0)) from table1
即可

7 楼

谢谢5楼Leo64823900兄的精辟分析,和6楼兄弟的实例演示!!!!!!

本人真是受益良多!!

谢谢所有回贴的兄弟们!!

我来回复

您尚未登录,请登录后再回复。点此登录或注册