如何使用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
相关产品推荐
相关产品推荐

