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

goo*_*yui 3 sql t-sql sql-server

我在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]
Run Code Online (Sandbox Code Playgroud)

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

Mit*_*eat 7

这是你的问题:

declare @compliance decimal(10,5)

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

select CAST(FLOOR(@compliance *10)/10.0 AS DECIMAL(3,1))
Run Code Online (Sandbox Code Playgroud)

抛出"将数字转换为数据类型数字的算术溢出错误"错误.改变DECIMAL(4,1)工作,或@paola建议,改变你的条件>= 100.0

decimal(p,s): 
Run Code Online (Sandbox Code Playgroud)

p(精度)是将存储的最小小数位总数,包括小数点的左侧和右侧.精度必须是从1到最大精度为38的值.默认精度为18.

s(scale)是将存储在小数点右侧的小数位数.从p中减去此数字以确定小数点左侧的最大位数.

在您的情况下,decimal(3, 1)意味着总共3位数,小数点右边有1位数,

99.9
Run Code Online (Sandbox Code Playgroud)

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

999.9
Run Code Online (Sandbox Code Playgroud)


BCl*_*don 5

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

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

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

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