json_value在sql server 2019中对非法路径或非标量值静默返回null而非报错,需用isjson校验、n前缀处理中文键、用json_query提取对象/数组,并推荐nvarchar(max)存储及计算列优化。

JSON_VALUE 在 SQL Server 2019 中能直接提取 JSON 字符串里的标量值,但必须确保输入是合法 JSON、路径写对、类型匹配,否则返回 NULL 或报错。
为什么 JSON_VALUE 返回 NULL 而不是报错
这是设计行为:只要输入字符串是合法 JSON,但路径不存在、类型不匹配(比如用 $.age 提取一个对象而非数字),JSON_VALUE 就静默返回 NULL,不会中断查询。这容易掩盖数据结构偏差问题。
- 先用
ISJSON(json_column)确认字段内容是有效 JSON(非 0 即非法) - 对关键字段加
WHERE ISJSON(json_column) = 1过滤,避免NULL干扰业务逻辑 - 不要依赖
JSON_VALUE报错来发现问题——它本就不报错
JSON_VALUE 路径中含中文键名要加 N 前缀
SQL Server 对 Unicode 字符串路径敏感。如果 JSON 键是中文(如 "姓名"),路径参数必须声明为 Unicode 字符串,否则解析失败且返回 NULL。
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
- ✅ 正确:
JSON_VALUE(PersonInfo, N'$.姓名') - ❌ 错误:
JSON_VALUE(PersonInfo, '$.姓名')(ASCII 字符串,中文被截断或乱码) - 嵌套路径同样适用:
JSON_VALUE(PersonInfo, N'$.地址.城市')
提取数组元素或对象时别用 JSON_VALUE
JSON_VALUE 只能返回标量(string / number / boolean / null),不能返回 JSON 对象或数组。若路径指向的是对象或数组,结果恒为 NULL。
- 例如:
JSON_VALUE(json_detail, '$.value2')对{"value2": [{"vv21":13}]}返回NULL - 应改用
JSON_QUERY(json_detail, '$.value2')获取完整子结构 - 若需展开数组内容,必须配合
OPENJSON+WITH子句
性能和存储类型影响实际表现
JSON_VALUE 的执行效率取决于底层存储类型和索引支持:
- 推荐用
NVARCHAR(MAX)存 JSON,不用VARCHAR(中文会乱)或过时的TEXT(函数不兼容) - SQL Server 2019 不支持原生
JSON数据类型(那是 2022+ 才有),所以所有解析都是运行时字符串解析,无预编译加速 - 高频查询字段可考虑用计算列 + 持久化(
AS JSON_VALUE(...) PERSISTED)并建索引
最常被忽略的是路径字符串的 Unicode 前缀和标量/非标量的语义边界——这两个点一旦出错,JSON_VALUE 就“安静地失效”,查不出原因也报不了错。










