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

在Microsoft SQL Server中批量更新JSON数组所有对象的指定属性

解决方案

在SQL Server中,要批量修改JSON数组内所有对象的指定属性,通用实现思路是将JSON数组拆分为单个对象逐一修改,再重新组合为数组。以下提供两种适配不同场景的通用方案:

方案一:适配任意JSON结构(无需提前定义字段)

如果你的JSON对象结构不固定,仅需修改MTML属性并保留其他所有属性,可使用该方式:

DECLARE @Json varchar(MAX), @updatedJson varchar(MAX);
SET @Json ='[{"LocationID":1234,"LocationName":"ABCD","MTML":1},{"LocationID":12345,"LocationName":"LMNO","MTML":3}]'

-- 拆分数组为单个对象,修改MTML后重组数组
SELECT @updatedJson = (
    SELECT JSON_MODIFY(value, '$.MTML', 0) AS [*]
    FROM OPENJSON(@Json)
    FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
)

SELECT @updatedJson;

代码说明:

  • OPENJSON(@Json):将JSON数组拆分为多行数据,每行的value对应数组中的一个JSON对象。
  • JSON_MODIFY(value, '$.MTML', 0):对每个单独的JSON对象,将其MTML属性设为0。
  • FOR JSON PATH, WITHOUT_ARRAY_WRAPPER:将修改后的所有对象重新组合为一个JSON数组,WITHOUT_ARRAY_WRAPPER用于避免生成额外的嵌套数组。

方案二:适配固定JSON结构(明确字段定义)

如果你的JSON对象结构固定,可先提取所有字段,再构造包含修改后MTML的新JSON对象:

DECLARE @Json varchar(MAX), @updatedJson varchar(MAX);
SET @Json ='[{"LocationID":1234,"LocationName":"ABCD","MTML":1},{"LocationID":12345,"LocationName":"LMNO","MTML":3}]'

-- 提取字段并构造新的JSON数组
SELECT @updatedJson = (
    SELECT 
        LocationID,
        LocationName,
        0 AS MTML
    FROM OPENJSON(@Json)
    WITH (
        LocationID int '$.LocationID',
        LocationName varchar(50) '$.LocationName',
        MTML int '$.MTML'
    )
    FOR JSON PATH
)

SELECT @updatedJson;

代码说明:

  • OPENJSON(...) WITH (...):按指定字段提取JSON对象中的数据,转换为关系型表结构。
  • 直接将MTML设为0,保留其他字段原值,最后通过FOR JSON PATH重新生成JSON数组。

内容的提问来源于stack exchange,提问作者Mac Ank

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 02:22:49