SQLServer:将varchar(200,null)转换为decimal(5,2)时出错

我有以下 SQL Server 查询:

SELECT CAST(REPLACE(myField, ',', '.') as decimal(5,2))
FROM MyTable
WHERE some_condition

它不工作。抛出以下错误:

将 varchar 转换为数字类型的算术溢出错误。

  • myField 是 varchar(200, null) 类型
  • myField 包含字符串值 2430

如果我按如下方式对其进行测试,则会出现相同的错误:

DECLARE @strValue varchar(200) = '2430'
select CAST(REPLACE(@strValue, ',', '.') as decimal(5,2))

但是在指定 varchar 长度时以下有效(未显示上述错误):

DECLARE @strValue varchar = '2430'
select CAST(REPLACE(@strValue, ',', '.') as decimal(5,2))

...但在这种情况下获得的结果不正确:2.00

我究竟做错了什么?

回答

错误告诉你问题2430 太大了。decimal(5,2)可以存储的最大值是999.99。您需要在小数位前至少 4 位数字才能放入2430a 中decimal,这意味着您的精度必须至少比您的比例高 4 位。

DECLARE @strValue varchar(200) = '2430';
SELECT CAST(REPLACE(@strValue, ',', '.') as decimal(6,2));

至于为什么DECLARE @strValue varchar = '2430'有效,那是因为不定义数据类型的长度/精度/比例的设置是一个非常糟糕的习惯。DECLARE @strValue varchar = '2430'是的代名词DECLARE @strValue varchar(1) = '2430',并'2' 轻松地在适合decimal(5,2)


以上是SQLServer:将varchar(200,null)转换为decimal(5,2)时出错的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>