SQL Server:将varchar转换为decimal / float时出错

时间:2013-07-17 13:12:12

标签: sql sql-server-2005

我在尝试将varchar转换为decimal时收到错误。

我找到了错误的地方,但无法纠正错误。

我使用的代码是:

SELECT 
    CONVERT(DATETIME, dbo.PAYMENTS.recdate, 3) AS rdate,
    CONVERT(DECIMAL, dbo.PAYMENTS.amount),
    dbo.PAYMENTS.balance
FROM 
    dbo.PAYMENTS

我收到错误消息:

  

将数据类型varchar转换为数字时出错。

由于-5.862列中的值amount而发生错误。

我尝试将值-5.862更改为5,然后才能正常运行。

任何人都可以帮我转换varchardecimal,其值为-5.862

感谢。

1 个答案:

答案 0 :(得分:3)

这里的问题有两个:

  1. 您将数值存储为文本
  2. 您未验证该文本列的输入
  3. 您的评论显示您的价值存储方式如下:- 5.862,而不是这样:-5.862

    所以这里有一些SQL试用:

    select convert(decimal, '-5.862')
    select convert(decimal, '- 5.862')
    

    注意第一个“有效”(但让我们回过头来看),第二个抛出异常。

    这里的真实答案是将数值存储为文本,而是将它们存储在适当的数字数据类型中。除此之外,至少验证输入,确保您不允许非数字值爬入该列中的数据库,例如不允许在减号和数字之间留出空格。

    不要让不良数据进入您的表格。你不是通过这样做来保存任何工作。为了使现有数据正常工作,您需要执行的验证和修正可以更好地放置在数据进入表格的位置。

    “快速修复”就像保持裤子温暖一样:

    select convert(decimal, replace('- 5.862', ' ', ''))
    

    但这只会推迟问题,直到某人输入此内容:

    -5,862
    twenty
    !27
    

    即。其他无法转换的东西。由于您将它们存储为文本,因此您需要执行所有工作来修复错误值使用它们而不是它们的来源

    然而,正如其他人所建议的那样,还有另一个问题,那就是DECIMAL默认情况下不允许小数点后面的任何数字,所以上面工作的那个只产生{{1 }}

    要修复 问题,请指定精度:

    -6

    但是,我不能强烈地说这个:不要将数值存储为文本。这是一场等待发生的灾难(你已经想到了)。

相关问题