json_modify是sql server 2016+唯一原生支持就地更新json字段的函数,可安全更新属性值、插入键值对或删除键(传null),支持append追加数组元素、strict/lax路径模式及json_query包裹结构化值以避免转义错误。

JSON_MODIFY 是 SQL Server 2016+ 唯一原生支持「就地更新 JSON 字段」的函数,它不依赖字符串拼接或 REPLACE 这类易出错的手动操作,能安全处理嵌套结构、转义字符和类型一致性。如果你用 UPDATE 直接覆盖整个 JSON 字段,就丢失了原子性与字段级控制能力。
JSON_MODIFY 不能直接写入数组元素?
可以,但必须显式指定索引位置,且路径必须指向具体元素(不是整个数组)。常见错误是误把数组当对象更新:
-
JSON_MODIFY(@json, '$.tags', 'new')—— 把整个tags数组替换成字符串,不是你想要的 -
JSON_MODIFY(@json, '$.tags[0]', 'new')—— 正确:更新第一个元素 -
JSON_MODIFY(@json, 'append $.tags', 'new')—— 正确:追加到数组末尾(注意append是路径前缀,不是函数参数) - 若索引越界(如
$.tags[10]且数组只有 3 个元素),lax模式下静默失败,strict模式报错:JSON path is not valid
更新数组时为什么必须用 JSON_QUERY 包裹新值?
因为 JSON_MODIFY 默认把字符串参数当作标量值处理,会自动加双引号转义。直接传 '["a","b"]' 会导致结果变成 "[\"a\",\"b\"]"(即一个字符串,不是数组):
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
- ❌ 错误:
JSON_MODIFY(@json, '$.skills', '["C#","T-SQL"]') - ✅ 正确:
JSON_MODIFY(@json, '$.skills', JSON_QUERY('["C#","T-SQL"]')) - 同理,插入对象也必须用
JSON_QUERY('{...}'),否则会被当作文本字符串 -
JSON_VALUE不行——它只返回标量,不能用于构造合法 JSON 结构
NULL 值会删除键,但只在 lax 模式下生效
这是唯一能「删字段」的方式,但有隐含前提:
-
JSON_MODIFY(@json, '$.obsoleteField', NULL)在默认lax模式下,确实会移除该 key - 如果路径不存在(比如
$.missing.key),lax下静默忽略,strict下直接报错:The given path does not match a field in the JSON text - 不要指望用
NULL清空数组——它只会删掉整个 key;清空数组要用JSON_QUERY('[]') - 若字段本身是
NOT NULL列约束,删除后需确保业务逻辑允许该字段为空
性能和兼容性容易被忽略的点
JSON_MODIFY 返回的是 nvarchar(max),每次调用都生成新字符串,不复用原始内存。高频更新大 JSON 时要注意:
- 它不支持部分更新底层存储——SQL Server 仍按完整字段写入,无法跳过未修改的子树
- 路径中使用变量(如
@path = '$.config.timeout')仅在 SQL Server 2017+ 和 Azure SQL 支持,2016 不行 - 所有输入值(
newValue)必须是支持的类型:int、bit、nvarchar等;text类型直接报错:Argument data type text is invalid for argument 3 of JSON_MODIFY function - 如果原始 JSON 本身格式错误(哪怕只多一个逗号),
JSON_MODIFY立刻失败,建议前置ISJSON(@json) = 1校验
NULL 的行为依赖 lax/strict 模式——这些地方一错,结果就静默偏离预期。









