使用强制转换将数据类型varchar转换为数字时出错

时间:2012-11-19 15:05:52

标签: sql sql-server sql-server-2008

我在尝试使用varchar字段进行SUM时收到错误消息,即使使用Cast也会出现以下错误?

Error converting data type varchar to numeric

SUM(ISNULL(CAST(balance-current_balance_amount /100 AS float),0)) AS bal_diff

2 个答案:

答案 0 :(得分:3)

问题可能是您的余额列中包含非数字数据。如果数据有效,您甚至不需要CAST。

SUM(ISNULL((balance-current_balance_amount)/100 ,0)) AS bal_diff

来自CAST and CONVERT

  

隐式转化是指没有转化的转化   指定CAST或CONVERT函数。

VARCHAR到NUMERIC或FLOAT就是这样的例子。

由于您正在处理余额,可能有小数位且可能是“$”,因此CAST to MONEY应该可以解决您的问题。

SUM(ISNULL((CAST(balance AS MONEY)-current_balance_amount)/100 ,0))

如果您的余额列中有其他非数字数据在CAST到MONEY后仍然导致问题,您可以在SELECT中执行CASE语句

SUM(ISNULL(((CASE WHEN ISNUMERIC(balance) = 0 THEN NULL ELSE CAST(balance AS MONEY) END)-current_balance_amount)/100 ,0))

甚至更好,创建一个MONEY类型的新列并开始使用它。

答案 1 :(得分:1)

假设balance是一个varchar字段,在尝试进行计算之前,需要将其转换为数字(float,如果这就是你想要的)数据类型:

例如/

SUM(
  ISNULL(
    (CAST(balance AS FLOAT)-current_balance_amount)/100
  ,0)
) AS bal_diff