You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 12:15:07