算术溢出错误将数字转换为数据类型数字

时间:2011-08-29 14:42:13

标签: sql sql-server tsql

我的SQL脚本出现错误:

  

将数字转换为数据类型数字

的算术溢出错误
select x.MemberName,x.DOB,x.FilePath,x.Medication,x.NDC,x.Directions,x.Name,x.Strength,x.GenericName,x.QtyOrdered,x.DaysSupply,x.DateFilled, 
CASE
    WHEN x.test = 0  THEN 'N/A'
    WHEN compliance > 100.0   THEN '100.0'
    ELSE CONVERT(VARCHAR(5), CAST(FLOOR(compliance *10)/10.0 AS DECIMAL(3,1)))
END as [Compliance]

我正在上面的语法行面临错误。

2 个答案:

答案 0 :(得分:7)

这是你的问题:

declare @compliance decimal(10,5)

set @compliance = 100.0  --  <----------------

select CAST(FLOOR(@compliance *10)/10.0 AS DECIMAL(3,1))

引发“将数字转换为数据类型数字的算术溢出错误”错误。更改为DECIMAL(4,1)有效,或@paola建议,将您的条件更改为>= 100.0

decimal(p,s): 
  

p(precision)是最大的小数位数   存储在小数点的左侧和右侧。该   precision必须是从1到最大精度为38的值。   默认精度为18。

     

s(scale)是将存储到的小数位数   小数点右边。这个数字从p减去   确定小数点左边的最大位数   点。

在您的情况下,decimal(3, 1)表示总共3位数字,小数点右侧有1位数字,

99.9

decimal(4,1)提供总共4位数字,小数点右边有1位数,

999.9

答案 1 :(得分:3)

这个问题已经得到解答,但为什么很重要。

数字定义TOTAL位数,然后定义小数点后的数字。

所以DECIMAL(4,1)显示123.4 DECIMAL(4,3)显示1.234

在这两种情况下,您总共有4位数字。在一种情况下,您在小数点后面有1,在小数前面留下3。反之亦然。