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

Azure SQL查询特殊结构JSON无返回结果问题求助

问题原因

失效的核心原因是有问题的JSON最外层是数组结构(用[]包裹),而正常JSON是单个对象。原查询用OPENJSON(doc, '$.value')直接查找根对象下的value字段,但外层是数组时,根节点是数组,不存在$.value这个路径,自然返回空结果。

针对数组外层JSON的修复查询

先遍历外层数组的每个元素,再提取每个元素内部value数组里的数据:

SELECT jsond.*
FROM OPENROWSET (
        bulk 'adls/test/test.json',
        data_source = 'datalake',
        format = 'csv',
        fieldterminator ='0x0b',
        fieldquote = '0x0b',
        rowterminator = '0x0b'
    ) 
    WITH (doc nvarchar(max)) AS ROWS
    -- 遍历外层数组,获取每个数组元素
    CROSS APPLY OPENJSON(doc) AS outerArr
    -- 解析每个元素内的value数组
    CROSS APPLY OPENJSON(outerArr.value, '$.value')
        WITH (
            [Id] INT,
            [Year] INT,
            [Name] NVARCHAR(200)
        ) AS jsond
兼容两种JSON结构的通用查询

如果要同时支持单个对象和外层数组两种格式,可通过判断根节点类型统一处理:

SELECT jsond.*
FROM OPENROWSET (
        bulk 'adls/test/test.json',
        data_source = 'datalake',
        format = 'csv',
        fieldterminator ='0x0b',
        fieldquote = '0x0b',
        rowterminator = '0x0b'
    ) 
    WITH (doc nvarchar(max)) AS ROWS
    -- 判断根节点类型,统一转为数组遍历逻辑
    CROSS APPLY (
        CASE WHEN ISJSON(doc) = 1 AND JSON_VALUE(doc, '$') LIKE '[%' THEN
            OPENJSON(doc)
        ELSE
            -- 单个对象包装成数组,对齐数组处理逻辑
            OPENJSON(CONCAT('[', doc, ']'))
        END
    ) AS outerArr
    CROSS APPLY OPENJSON(outerArr.value, '$.value')
        WITH (
            [Id] INT,
            [Year] INT,
            [Name] NVARCHAR(200)
        ) AS jsond

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 13:27:18