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)。
THE END
二维码