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

T-SQL计算JSON嵌套层级的脚本抛JSON格式错误,求助排查

问题原因与修复方案

错误的核心原因是递归过程中未过滤非JSON对象/数组的标量值节点:

  • 当递归到叶子节点(比如示例中的"level4": "1")时,value是字符串标量"1",此时JSON_QUERY(value)会返回NULL
  • 后续递归调用OPENJSON(Obj)时,传入的Obj为NULL,在SQL Server的部分版本中,这会被解析为无效的JSON文本,从而抛出"位置1处发现意外字符'.'"的错误

修复方法是在递归CTE的UNION ALL分支中添加过滤条件,仅对合法的JSON对象/数组继续递归:

DECLARE @json NVARCHAR(MAX) = '{
    "level1": {
        "level2": {
            "level3": {
                "level4": "1"
            }
        },
        "level2B": {}
    },
    "level1B": {}
}';

-- Recursive CTE to find the depth of the JSON
WITH RecursiveCTE AS 
(
    SELECT 
        JSON_QUERY(@json) AS Obj, 
        1 AS Depth 
    WHERE 
        ISJSON(@json) > 0
    UNION ALL
    SELECT 
        JSON_QUERY(value) AS Obj, 
        Depth + 1 
    FROM 
        RecursiveCTE 
    CROSS APPLY OPENJSON(Obj)
    -- 添加过滤条件:仅处理合法的JSON对象/数组
    WHERE ISJSON(value) > 0
)
SELECT MAX(Depth) AS MaxDepth
FROM RecursiveCTE;

该修改会终止对非JSON对象/数组节点的递归,避免向OPENJSON传入无效参数,同时能正确计算出JSON的最大嵌套层级(示例中结果为4)。

内容的提问来源于stack exchange,提问作者FaCoffee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 02:55:14