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

SQL Server 2016中JSON_VALUE用变量路径报错的解决方案咨询

解决SQL Server 2016中JSON_VALUE变量路径报错问题

SQL Server 2016的JSON_VALUE仅支持字符串字面量作为路径参数,不允许动态拼接的变量路径,这就是你遇到报错的原因。可以通过OPENJSON替代实现按索引取值的需求,以下提供两种可行方案:

方案一:一次性解析所有数据到表变量,按需读取

先将整个JSON数组解析为带索引的表结构,之后直接按索引查询目标数据,适合需要多次读取不同索引元素的场景:

DECLARE @json NVARCHAR(MAX) = N'{
    "individual": [
        {
            "app_id": 1057029,
            "size": 2
        },
        {
            "app_id": 1057053,
            "size": 3
        },
        {
            "app_id": 1057048,
            "size": 1
        }
    ]
}';

-- 定义表变量存储解析后的数据,包含数组索引
DECLARE @IndividualData TABLE (
    IndexId INT,
    AppId INT,
    Size INT
);

-- 解析JSON数组,提取索引、app_id和size
INSERT INTO @IndividualData (IndexId, AppId, Size)
SELECT 
    CAST([key] AS INT) AS IndexId,
    JSON_VALUE(value, '$.app_id') AS AppId,
    JSON_VALUE(value, '$.size') AS Size
FROM OPENJSON(@json, '$.individual');

-- 示例:获取索引为1的元素(SQL Server数组索引从0开始)
DECLARE @i INT = 1;
SELECT @appId = AppId, @len = Size 
FROM @IndividualData 
WHERE IndexId = @i;

方案二:循环中用OPENJSON获取指定索引的单个元素

贴近你原本的循环逻辑,每次循环仅提取对应索引的元素:

DECLARE @json NVARCHAR(MAX) = N'{
    "individual": [
        {
            "app_id": 1057029,
            "size": 2
        },
        {
            "app_id": 1057053,
            "size": 3
        },
        {
            "app_id": 1057048,
            "size": 1
        }
    ]
}';

DECLARE @i INT = 0;
DECLARE @totalCount INT;
DECLARE @appId INT;
DECLARE @len INT;

-- 获取数组总元素数
SET @totalCount = (SELECT COUNT(*) FROM OPENJSON(@json, '$.individual'));

WHILE @i < @totalCount
BEGIN
    -- 筛选指定索引的元素并提取字段
    SELECT 
        @appId = JSON_VALUE(value, '$.app_id'),
        @len = JSON_VALUE(value, '$.size')
    FROM OPENJSON(@json, '$.individual')
    WHERE [key] = CAST(@i AS NVARCHAR(10));

    -- 这里添加你的业务逻辑,比如处理当前元素
    PRINT CONCAT('AppId: ', @appId, ', Size: ', @len);

    SET @i = @i + 1;
END

关键说明

  • OPENJSON解析数组时,[key]字段返回的是元素的索引(字符串类型,从0开始计数),需要与循环变量@i的字符串形式匹配
  • 方案一的一次性解析效率更高,适合多索引读取场景;方案二更贴合原循环逻辑,适合逐个处理元素的需求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 19:50:44