刚才我在运行存储过程时遇到了这个错误:
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)
我不想再次运行整个程序而不确定我是否已修复此问题。谢谢你的帮助。
答案 0 :(得分:1)
如果使用字符串函数,即LEFT
,则会重新生成字符串值。如上所述here,LEFT
函数的返回数据类型确实返回VARCHAR
或NVARCHAR
。因此,需要CAST
或CONVERT
返回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