1

我在尝试将其转换varchardecimal.

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

我使用的代码是:

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.8625然后它可以正常工作。

任何人请帮我转换varchardecimal价值-5.862

谢谢。

4

1 回答 1

4

这里的问题是双重的:

  1. 您将数值存储为文本
  2. 您没有验证对该文本列的输入

你的评论说你的价值是这样存储的:- 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

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

但是,正如其他人在这里所建议的那样,还有另一个问题,那就是DECIMAL默认情况下不允许小数点后的任何数字,所以上面的工作只产生-6.

要解决问题,请指定精度:

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

但是,我不能说得足够强烈:不要将数值存储为 text。这是一场等待发生的灾难(你已经知道了)。

于 2013-07-17T13:47:10.380 回答