【问题标题】:Arithmetic overflow error converting varchar to data type numeric?将varchar转换为数字数据类型的算术溢出错误?
【发布时间】:2014-09-15 14:15:06
【问题描述】:

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

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)

我不想在不确定是否已解决问题的情况下再次运行整个过程。感谢您的帮助。

【问题讨论】:

  • 我认为您需要在减法之前将其转换回浮点数:SELECT @AF_MIN_3L = CAST(LEFT(MIN([A-F Est_CY]), 6) AS float ) - 0.000001 FROM #Ent_AF_3 但我想这取决于您实际想要完成的任务。
  • 您的操作似乎出了问题——不应该是MIN(CAST(LEFT([A-F Est_CY], 6) AS FLOAT))吗?取左边6个字符,转换成float,求最小值?
  • 你的目标是什么? select @a=-0.00001 导致 select @a > -1E-05select LEFT(@a, 6) > -1e-00

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


【解决方案1】:

如果你使用字符串函数,也就是LEFT,它会返回一个字符串值。如here 所述,LEFT 函数的返回数据类型确实返回VARCHARNVARCHAR。因此,ideed,需要将 CASTCONVERT 返回到 FLOAT。您当然应该在 LEFT 函数之后转换回 FLOAT,所以它是:CAST(LEFT(...) as FLOAT)。

【讨论】:

  • 这很好用,谢谢。 CAST(LEFT(MIN([A-F Est_CY]), 6) AS FLOAT) - 0.000001 删除了错误。
  • @ultimate8 Declare @a float select @a=-0.00001 select CAST(LEFT(@a, 6) AS FLOAT) - 0.000001 会导致 -1,000001 ,我想这不是你想要的吗?
【解决方案2】:

问题在于您的精度 - 如果您在临时文件上有一个 > 0.999999 的浮点数,您将因为隐式转换而收到错误。

用途:

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

【讨论】:

  • 直到我重新运行我的程序后才看到这个,但这正是我最终要做的。它运行时没有错误,所以谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多