SQL Server:将 varchar(200, null) 转换为十进制 (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 位数字才能将2430放入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)

最新更新