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

