将varchar转换为数据类型numeric的算术溢出错误?

时间:2014-09-15 14:15:06

标签: sql sql-server sql-server-2012

刚才我在运行存储过程时遇到了这个错误:

Arithmetic overflow error converting varchar to data type numeric.

我找到了该错误所在的行,这是该行的代码:

SELECT @AF_MIN_3L = LEFT(MIN([A-F Est_CY]), 6) - 0.000001 FROM #Ent_AF_3

在存储过程的早期,我将@ AF_MIN_3L声明为数据类型FLOAT,创建临时表#Ent_AF_3,并在此过程中,使列[A-F Est_CY]数据类型为FLOAT。以下代码是否创建了非FLOAT值?

LEFT(MIN([A-F Est_CY]), 6) - 0.000001

我希望这是一个简单的投射问题,我所要做的就是这样:

LEFT(MIN(CAST([A-F Est_CY] AS FLOAT)), 6) - CAST(0.000001 AS FLOAT)

我不想再次运行整个程序而不确定我是否已修复此问题。谢谢你的帮助。

2 个答案:

答案 0 :(得分:1)

如果使用字符串函数,即LEFT,则会重新生成字符串值。如上所述hereLEFT函数的返回数据类型确实返回VARCHARNVARCHAR。因此,需要CASTCONVERT返回FLOAT。您当然应该在FLOAT函数之后转换回LEFT,因此它将是:CAST(LEFT(...)作为FLOAT)。

答案 1 :(得分:0)

问题在于你的精确度 - 如果你有浮动> 0.999999在临时文件中,由于隐式转换,您将收到错误。

使用:

SELECT CAST(LEFT(MIN([A-F Est_CY]), 6) AS float) - 0.000001 FROM #Ent_AF_4