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

如何循环遍历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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 04:13:08