我有以下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)
。