使用SQL Server OPENJSON将JSON数据转换为指定格式数据表
解决方法:拆分JSON数组实现questionId与answer一一对应
你的问题出在没有正确拆解answer这个嵌套数组——原来的SQL尝试直接提取整个数组,而不是把数组里的每个元素单独拆成行。下面是修正后的实现:
正确的SQL语句
DECLARE @responseJson NVARCHAR(MAX) = N'{ "Response": [ { "questionId": 1, "answer": [ "5","6" ] }, { "questionId": 2, "answer": [ "5" ] } ] }' SELECT JSON_VALUE(r.value, N'$.questionId') AS QuestionId, a.value AS Answer FROM OPENJSON(@responseJson, N'$.Response') r CROSS APPLY OPENJSON(r.value, N'$.answer') a
代码解释
- 第一步:
OPENJSON(@responseJson, N'$.Response') r先解析外层的Response数组,得到每个包含questionId和answer数组的JSON对象。 - 第二步:
CROSS APPLY OPENJSON(r.value, N'$.answer') a对每个外层对象里的answer数组做二次解析,把数组中的每个元素单独拆分成一行,a.value就是数组里的单个answer值。 - 第三步:用
JSON_VALUE(r.value, N'$.questionId')从外层对象中提取对应的questionId,和每个拆分后的answer值做关联。
执行结果
执行后会得到你期望的一一对应的数据表:
| QuestionId | Answer |
|---|---|
| 1 | 5 |
| 1 | 6 |
| 2 | 5 |
如果你的answer数组里是复杂JSON对象(而非简单字符串),可以在第二个OPENJSON里用WITH子句来指定字段映射,比如:
CROSS APPLY OPENJSON(r.value, N'$.answer') WITH ( AnswerValue NVARCHAR(100) '$.value' ) a
内容的提问来源于stack exchange,提问作者Raj




