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

