使用JSON_VALUE提取JSON数组ID数组报错问题求助
问题解决方法
错误原因
JSON_VALUE函数只能提取单个标量JSON值(比如字符串、数字、布尔值),而你用的$..ID是递归路径,会匹配JSON数组里所有对象的ID并返回一个数组([1,2]),这不符合JSON_VALUE的参数要求,因此触发"JSON path is not properly formatted"报错。
解决方案
根据你的需求,分两种场景处理:
1. 将JSON数组拆分为多行,每行对应一个对象的3列(ID、Change、Painted)
使用OPENJSON解析数组并指定列映射:
SELECT JSON_VALUE(item.value, '$.ID') AS ID, JSON_VALUE(item.value, '$.Change') AS [Change], JSON_VALUE(item.value, '$.Painted') AS Painted FROM 你的数据表 CROSS APPLY OPENJSON(你的JSON列名) AS item
这段SQL会把原JSON数组里的每个对象拆成一行,每行包含对应的ID、Change、Painted值。
2. 提取所有ID组成的数组(同时可保留拆分后的列)
如果需要单独提取所有ID组成的JSON数组,使用JSON_QUERY函数(它支持返回JSON对象或数组):
SELECT JSON_QUERY(你的JSON列名, '$..ID') AS ID数组, JSON_VALUE(item.value, '$.ID') AS ID, JSON_VALUE(item.value, '$.Change') AS [Change], JSON_VALUE(item.value, '$.Painted') AS Painted FROM 你的数据表 CROSS APPLY OPENJSON(你的JSON列名) AS item
若仅需提取ID数组,可简化为:
SELECT JSON_QUERY(你的JSON列名, '$..ID') AS ID数组 FROM 你的数据表
注意事项
- 替换SQL中的
你的数据表和你的JSON列名为实际的表名与列名 Change是SQL关键字,需用方括号[Change]包裹以避免语法错误
内容的提问来源于stack exchange,提问作者Hasan ÇAKMAK
相关产品推荐
相关产品推荐

