如何让SQL Server将无效数值字段解析为0
解决Quantity列非数值字符转换报错的问题
嘿,这个问题我太熟悉了!你现在用的CAST(ISNULL(Quantity, 0) as decimal)只能处理NULL值,但碰到字母这类非数值字符时直接就报错了——这时候得用**TRY_CAST**(或者TRY_CONVERT)来救场!
核心思路
TRY_CAST和普通CAST的关键区别在于:如果转换失败(比如碰到字母、特殊符号这类非数值内容),它不会抛出错误,而是返回NULL。接着你再用ISNULL把这个转换失败得到的NULL替换成0,就和处理原本NULL值的逻辑完全统一了。
修改后的查询语句
把你原来的Sum聚合部分替换成下面的写法就行,子查询的其他部分保持不变:
Select DocId, AR_Numbers, PONO, Product, Sum(ISNULL(TRY_CAST(Quantity as decimal), 0)) as Qty from ( Select ARs.DocID, Ars.Field61 as AR_Numbers, PONOs.Field21 as PONO, CoreData.Field9 as Product, CoreData.Field10 as Quantity from ssMVFields ARs left... -- 你的子查询剩余代码无需改动 ) as SubQuery group by DocId, AR_Numbers, PONO, Product -- 别忘了添加分组,聚合函数需要对应的分组字段
补充说明
- 如果你用的是SQL Server,
TRY_CONVERT(decimal, Quantity)和TRY_CAST(Quantity as decimal)效果完全一致,选哪个都可以,看个人习惯。 - 这个逻辑能覆盖所有无法解析为decimal的无效值,不管是字母、特殊符号还是超长字符串,都会被统一当成0参与求和,彻底解决转换报错的问题。
内容的提问来源于stack exchange,提问作者Heap of Pinto Beans
相关产品推荐
相关产品推荐

