将数值转换为decimal(10,2)格式时遇错误,求解决方法
SQL查询结果格式问题及错误解决
错误原因
你遇到的Msg 245错误,核心原因是CASE语句的两个分支返回数据类型不匹配:
WHEN分支返回的是整数0(int类型)ELSE分支返回的是字符串类型(经过CAST和REPLACE处理后)
SQL Server会自动尝试将低优先级类型转换为高优先级类型,这里字符串会被尝试转换为int,但'99.00'包含小数点,无法转换为整数,因此报错。
解决方案
方案1:统一CASE分支返回类型为字符串
将WHEN分支的0转为带两位小数的字符串,保证两个分支类型一致:
SELECT CASE WHEN ISNUMERIC('9900') != 1 THEN '0.00' ELSE REPLACE(CAST(CAST('9900' AS decimal(10,2))/100 AS VARCHAR(20)), '0000', '') END AS BVN
方案2:直接格式化数值为指定小数位的字符串
无需REPLACE,直接通过CAST将数值转换为指定长度的字符串,自动保留两位小数:
SELECT CASE WHEN ISNUMERIC('9900') != 1 THEN '0.00' ELSE CAST(CAST('9900' AS decimal(10,2))/100 AS VARCHAR(10)) END AS BVN
方案3:使用FORMAT函数(SQL Server 2012+)
FORMAT函数可以直接指定数值格式,更直观:
SELECT CASE WHEN ISNUMERIC('9900') != 1 THEN '0.00' ELSE FORMAT(CAST('9900' AS decimal(10,2))/100, 'N2') END AS BVN
方案4:返回数值类型而非字符串
如果业务允许返回数值类型而非字符串,直接将结果CAST为decimal(10,2),查询结果会显示为99.00:
SELECT CASE WHEN ISNUMERIC('9900') != 1 THEN CAST(0 AS decimal(10,2)) ELSE CAST('9900' AS decimal(10,2))/100 END AS BVN
内容的提问来源于stack exchange,提问作者Sup Ravi Kumar
相关产品推荐
相关产品推荐

