在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
相关产品推荐
相关产品推荐

