如何循环遍历JSON数组批量插入SQL表?现有单条插入已实现
解决方案
一、SQL端直接遍历所有数组项
只需修改OPENJSON的调用逻辑,先遍历根JSON数组的所有元素,再展开每个元素下的choices子数组,就能自动适配数组长度变化,批量插入所有choices数据:
DECLARE @jsonFieldAttributesChoicesData NVARCHAR (MAX) = '*Some JSON String*' TRUNCATE TABLE FD_FieldAttributes_Choices INSERT INTO FD_FieldAttributes_Choices SELECT parent_choice_id = JSON_VALUE(choice.value, '$.parent_choice_id'), id = JSON_VALUE(choice.value, '$.id'), label = JSON_VALUE(choice.value, '$.label'), label_for_customers = JSON_VALUE(choice.value, '$.label_for_customers'), value = JSON_VALUE(choice.value, '$.value'), stop_sla_timer = JSON_VALUE(choice.value, '$.stop_sla_timer'), [default] = JSON_VALUE(choice.value, '$.default'), position = JSON_VALUE(choice.value, '$.position'), deleted = JSON_VALUE(choice.value, '$.deleted') -- 遍历根数组的全部元素 FROM OPENJSON(@jsonFieldAttributesChoicesData) AS rootItem -- 交叉展开每个根元素的choices子数组 CROSS APPLY OPENJSON(rootItem.value, '$.choices') AS choice
通过CROSS APPLY将根数组每个元素内的choices子数组展开,无论根数组后续长度如何变化,都会自动遍历所有choices数据完成插入。
二、前端JavaScript预处理JSON
如果要在前端先合并所有choices再传给后端,可按以下逻辑处理:
假设网页生成的原始JSON是数组格式(示例变量名为originalJsonArray),提取并合并所有choices:
// 网页生成的原始JSON数组 const originalJsonArray = [/* 原始JSON数组内容 */]; // 提取所有choices并合并为单一数组 const allChoices = originalJsonArray.flatMap(item => { // 兼容无choices属性的元素,避免报错 return item.choices || []; }); // 转换为JSON字符串,传给后端接口 const processedJsonString = JSON.stringify(allChoices);
此时后端收到的processedJsonString是所有choices的集合,SQL查询可简化为直接读取整个JSON数组:
DECLARE @jsonFieldAttributesChoicesData NVARCHAR (MAX) = '*处理后的JSON字符串*' TRUNCATE TABLE FD_FieldAttributes_Choices INSERT INTO FD_FieldAttributes_Choices SELECT parent_choice_id = JSON_VALUE(j.value, '$.parent_choice_id'), id = JSON_VALUE(j.value, '$.id'), label = JSON_VALUE(j.value, '$.label'), label_for_customers = JSON_VALUE(j.value, '$.label_for_customers'), value = JSON_VALUE(j.value, '$.value'), stop_sla_timer = JSON_VALUE(j.value, '$.stop_sla_timer'), [default] = JSON_VALUE(j.value, '$.default'), position = JSON_VALUE(j.value, '$.position'), deleted = JSON_VALUE(j.value, '$.deleted') FROM OPENJSON(@jsonFieldAttributesChoicesData) AS j
内容的提问来源于stack exchange,提问作者AshJam
相关产品推荐
相关产品推荐

