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
相关产品推荐
相关产品推荐

