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

如何使用JSON_MODIFY()更新SQL中JSON数组内指定的JSON值?

用JSON_MODIFY()更新JSON数组中指定id的对象

当然可以啦!JSON_MODIFY()完全能搞定这个需求——不过因为要精准定位到数组里id=102的那项,得结合JSON路径过滤(SQL Server 2017及以上支持)或者辅助逻辑来找到目标元素,我结合你提供的实际数据给你演示具体操作:

场景1:更新对象的单个属性

比如你想把BookList.Value数组里id=102的name从"Book2"改成"UpdatedBook2",可以用下面的SQL语句:

-- 假设你的表名为StudentBooks,存储JSON的列名为StudentData
UPDATE StudentBooks
SET StudentData = JSON_MODIFY(
    StudentData,
    -- 用过滤路径定位到id=102的对象的name属性
    '$.Details.BookList.Value[?(@.id == "102")].name',
    'UpdatedBook2' -- 替换成你想要的新值
)
-- 可选:根据SId定位到特定行,避免更新所有数据
WHERE JSON_VALUE(StudentData, '$.Details.SId.Value') = '1234';

场景2:替换整个JSON对象

如果要把id=102的整个对象替换成新的(比如新增author属性),记得用JSON_QUERY()包裹新对象,防止JSON_MODIFY()把它转成带引号的字符串破坏JSON结构:

UPDATE StudentBooks
SET StudentData = JSON_MODIFY(
    StudentData,
    '$.Details.BookList.Value[?(@.id == "102")]',
    -- 用JSON_QUERY确保新对象被识别为JSON类型,而非字符串
    JSON_QUERY('{"id": "102", "name": "UpdatedBook2", "author": "Jane Doe"}')
)
WHERE JSON_VALUE(StudentData, '$.Details.SId.Value') = '1234';

注意事项

  • 路径过滤语法[?(@.id == "102")]需要SQL Server 2017及更高版本支持;如果是2016版本,你需要先把JSON数组拆分成行,修改后再重新组合成数组,操作会稍复杂一些。
  • 一定要确保路径表达式准确,否则会修改到错误的元素或者导致JSON结构损坏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:54:41