2011-08-29 83 views
2

我面对我的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] 

我对着上面的语法行错误。

+0

列合规性保持什么值? –

+0

它具有'N/A','100.0'或'99.1'等值,即它具有浮动和nvarchar – goofyui

回答

5

这是你的问题:

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(精度)是将 存储的十进制数字的最大总数,同时向左侧和小数点右侧。所述 精度必须是从1的值通过38 最大精度默认精度为18

S(比例)是将要存储到小数点的右边 小数的位数。将该数字从p中减去 确定小数点左边的最大位数 。

在你的情况decimal(3, 1)指共3位与1位小数点的右边,

99.9 

decimal(4,1)共4位用1位提供的权小数点,

999.9 
+0

@Compliance必须同时接受NVARCHAR和FLOAT。即)如果没有合规......我们需要将其设置为N/A – goofyui

+0

我不建议以其他方式。 –

+1

@Chok,我认为Mitch是对的,您可能需要将您的第二个案例更改为'WHEN compliance> = 100.0'(注意=>) –

3

这个问题已经回答了,但为什么是很重要的。

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

的十进制(4,1)显示123.4 DECIMAL(4,3)显示1.234

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

+0

除了问题只使用十进制(3,1).... –

相关问题