我在尝试将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
,然后才能正常运行。
任何人都可以帮我转换varchar
到decimal
,其值为-5.862
感谢。
答案 0 :(得分: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
但是,我不能强烈地说这个:不要将数值存储为文本。这是一场等待发生的灾难(你已经想到了)。