将表达式转换为数据类型numeric的算术溢出错误

时间:2016-04-26 10:45:52

标签: sql-server oracle

SELECT ROUND(99.12,-1); 
  

Msg 8115,Level 16,State 2,Line 1算术溢出错误   将表达式转换为数据类型数字。

表达式范围为:

时会出现此错误
  1. 95.00至99.99
  2. 5.00至9.99
  3. 995.00至999.99,依此类推 除了这个范围,它按预期工作。
  4. 但是当您在Oracle DB中执行相同的查询时,它可以正常工作并提供预期的输出。

    SELECT ROUND(99.12,-1) FROM DUAL;
    ans: 100
    

    所以有人可以解释,为什么它在sqlserver2008

    中的行为

    提前致谢

2 个答案:

答案 0 :(得分:3)

执行SELECT ROUND(99.12,-1)时,第一个参数隐含NUMERIC(4,2),并且在小数位前不允许超过2位。

95.00到99.99失败的原因是它们被舍入到100,这不适合NUMERIC(4,2)。类似的逻辑适用于您的其他边缘情况。

阅读this MSDN article进行令人大开眼界的讨论。

答案 1 :(得分:1)

SELECT ROUND(CAST(99.12 AS DECIMAL(5, 2)),-1);