json_value总返回null是因为输入非json、路径错误或指向非标量值;需先用isjson验证,路径须以$开头、严格匹配键名大小写和中文转义,且仅支持标量提取。

JSON_VALUE 在 SQL Server 2019 中能用,但只返回标量值(字符串、数字、布尔、null),且对输入和路径极其敏感——写错一点就静默返回 NULL,不是函数坏了,是条件没满足。
为什么 JSON_VALUE 总是返回 NULL?先查 ISJSON 和路径合法性
它不报错,只沉默失败。最常踩的坑就三个:
-
ISJSON(json_col)返回 0:字段里存的是 HTML 片段、带换行的普通文本、或未转义双引号的字符串,根本不是合法 JSON - 路径没以
$开头,比如写成'name'而不是'$.name' - 路径指向了对象或数组,比如
'$.items'(items是数组)或'$.address'(address是对象)——JSON_VALUE只认标量,遇到就返回NULL
安全做法:在查询前加 WHERE ISJSON(json_col) = 1,再单独用 SELECT JSON_VALUE(json_col, '$.xxx') 测试路径是否真能取到值。
中文键名、数组索引、大小写必须严格匹配
SQL Server 的路径解析是字面量匹配,不自动容错:
- 中文键名必须用方括号转义:
'$.["收货地址"]',不能写'$.收货地址' - 取数组第一项的字段:
'$[0].price',不能漏掉[0]或写成'$.items.price' - 键名大小写敏感:
'$.Name'和'$.name'是两个路径,一个可能返回值,另一个返回NULL - 不能用点号访问数字键:
'$.0.name'非法,得写成'$[0].name'
在视图或存储过程中使用时,类型和长度不能省
参数或字段声明错误,会导致隐式截断或乱码,后续 JSON_VALUE 必然失效:
- 存储过程参数必须是
NVARCHAR(MAX),不能用VARCHAR(中文会乱)或TEXT(不支持 JSON 函数) - 表中 JSON 字段建议定义为
NVARCHAR(MAX);如果用了VARCHAR(200)却存了 300 字节 JSON,超出部分被丢弃,ISJSON就会返回 0 - 视图里多次调用
JSON_VALUE(如提取 5 个字段),每行都会重复解析整段 JSON,执行计划里会出现多个Compute Scalar,大表上性能明显下降
JSON_VALUE vs JSON_QUERY:别拿它去取对象或数组
这是最易混淆也最常出错的点:
-
JSON_VALUE(json_col, '$.status')→ 返回'success'(字符串)或123(数字,但类型仍是varchar(4000)) -
JSON_VALUE(json_col, '$.items')→ 返回NULL(因为items是数组) - 要取整个
items数组,得用JSON_QUERY(json_col, '$.items'),它返回原样 JSON 字符串,可进一步交给OPENJSON展开 - 需要同时取多个字段(尤其跨层级),优先用
OPENJSON+WITH子句,一次解析、结构清晰、还能映射类型
真正麻烦的不是语法,而是所有 JSON 函数都基于字符串实时解析,没有缓存。同一段 JSON 在一个查询里被 JSON_VALUE 调用三次,就解析三次——这点在复杂视图或嵌套 CTE 里特别容易被忽略。











