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

SQL Server中如何修改多对象JSON数组的所有值?

解决SQL Server中修改JSON数组所有对象指定属性的问题

哦,这个问题我之前也碰到过!你用JSON_MODIFY(@json, '$.Sex', 'M')不行的原因很简单——你的JSON根是一个数组(被[]包裹),根节点根本没有Sex属性,$.Sex这个路径找不到任何匹配的内容,自然不会生效。

要修改数组里所有对象的sex值,我们需要先把数组拆分成单个对象,修改后再重新组装成数组,下面给你两种实用的解决方案:

方案1:明确对象结构时使用(适合已知所有属性的场景)

如果你清楚JSON对象里的所有属性,可以用OPENJSON解析出每个属性,修改目标属性后再用FOR JSON PATH重新生成数组:

DECLARE @json nvarchar(MAX) 
SET @json = N'[{"name": "John","sex": "F"}, {"name": "Jane","sex": "F"}]'

-- 修改所有对象的sex值为'M'
SET @json = (
    SELECT 
        name,
        'M' AS sex  -- 直接将sex设为目标值
    FROM OPENJSON(@json)
    WITH (
        name nvarchar(50) '$.name',  -- 映射JSON中的name属性
        sex nvarchar(1) '$.sex'      -- 映射JSON中的sex属性
    )
    FOR JSON PATH  -- 将结果重新组合成JSON数组
)

-- 查看修改后的JSON
SELECT @json AS ModifiedJson

这段代码的逻辑是:

  • OPENJSON(@json)把JSON数组拆分成两行数据,每行对应一个对象
  • WITH子句定义了要解析的属性和数据类型
  • 我们直接将sex列的值设为'M'
  • FOR JSON PATH把修改后的行重新拼接成JSON数组

方案2:通用解决方案(适合未知对象所有属性的场景)

如果JSON对象里有很多不确定的属性,不想逐个映射,可以直接修改每个数组元素的sex属性,保留其他所有内容:

DECLARE @json nvarchar(MAX) 
SET @json = N'[{"name": "John","sex": "F"}, {"name": "Jane","sex": "F"}]'

-- 修改所有对象的sex值为'M',保留其他属性
SET @json = (
    SELECT JSON_QUERY(JSON_MODIFY(value, '$.sex', 'M')) AS *
    FROM OPENJSON(@json)
    FOR JSON PATH
)

-- 查看修改后的JSON
SELECT @json AS ModifiedJson

这段代码的逻辑是:

  • OPENJSON(@json)返回的value列就是数组里的每个完整JSON对象
  • JSON_MODIFY(value, '$.sex', 'M')修改单个对象的sex属性
  • JSON_QUERY告诉SQL Server这个结果是JSON对象,避免被转义成字符串
  • FOR JSON PATH把所有修改后的对象重新组合成数组

运行任意一种方案后,你都会得到修改后的JSON:[{"name":"John","sex":"M"},{"name":"Jane","sex":"M"}]

内容的提问来源于stack exchange,提问作者Raziel Naing

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:56:34