SQL Server递归CTE查询BOM数量时q列类型不匹配报错求解
解决方案
修改后可正常执行的代码如下:
with all_item_counts as ( select ParentId, Id, CAST(Quantity AS numeric(24, 5)) as q, 0 as level from dbo.MBOM union all select all_item_counts.ParentId, dbo.MBOM.Id, CAST(dbo.MBOM.Quantity * all_item_counts.q AS numeric(24, 5)), level + 1 from all_item_counts join dbo.MBOM on dbo.MBOM.ParentId = all_item_counts.Id ) select ParentId, Id, sum(q) from all_item_counts group by ParentId, Id
报错根因
- SQL Server递归CTE强制要求锚点成员和递归成员的所有对应列的数据类型(包含精度、刻度)完全一致
- 锚点中
q列直接取自Quantity字段,类型为numeric(24, 5) - 递归部分两个
numeric类型值相乘后,SQL Server会按照默认规则自动推导新的精度和刻度,最终得到的类型和numeric(24, 5)不匹配,触发类型冲突错误
补充说明
如果业务中存在多层BOM递归后乘积数值过大、超出numeric(24,5)范围的场景,可以将统一转换的类型调整为精度更高的类型,比如numeric(38, 10),只要锚点和递归部分的转换目标类型一致即可。
内容的提问来源于stack exchange,提问作者SeminoleKing
相关产品推荐
相关产品推荐

