json_value用于提取json字符串中的标量值,要求输入为合法json且路径指向标量节点,否则返回null;需配合isjson校验、路径规范及类型转换确保安全使用。

JSON_VALUE 是 SQL Server 2016+ 提供的内置函数,专门用于从 JSON 字符串中提取**标量值**(如字符串、数字、布尔值、null)。它不解析整个 JSON,也不支持返回对象或数组 —— 如果你试图用它取一个嵌套对象,结果直接是 NULL。
为什么 JSON_VALUE 返回 NULL?常见原因和验证步骤
这不是函数失效,而是输入或路径不满足前提条件。最常踩的坑有三个:
-
JSON_VALUE要求第一个参数必须是合法的 JSON 字符串(类型为varchar/nvarchar),且内容通过ISJSON()检查返回 1;如果字段里存的是普通文本、带 HTML 标签的字符串、或未转义的双引号,ISJSON(your_column)就是 0,JSON_VALUE必然返回NULL - JSON 路径表达式(第二个参数)必须以
$开头,且只能指向一个标量节点。例如:'$.name'✅,'$.items'❌(如果items是数组),'$[0].name'✅(取数组首项的 name),但'$[0]'❌(返回对象,不是标量) - SQL Server 默认使用宽松路径模式(lax),遇到不存在的路径会静默返回
NULL;若想报错提醒,得显式写成'lax $.missing.field'或改用'strict $.missing.field'—— 后者在路径不存在时抛出运行时错误
如何安全地从 nvarchar(max) 字段中提取 JSON 字段
不能直接 SELECT JSON_VALUE(json_col, '$.status') 就完事。生产环境必须加防护:
详细的 Three.js 3D 图形参考,涵盖场景设置、相机、几何体、材质、光照、动画、控制器、加载器、数学工具和调试。
- 先用
WHERE ISJSON(json_col) > 0过滤掉非法 JSON 行(否则JSON_VALUE对非法输入也返回NULL,你分不清是字段为空还是格式错了) - 对关键字段做
TRY_CAST或ISNULL包裹,避免因NULL传播影响后续计算:例如ISNULL(JSON_VALUE(json_col, '$.amount'), '0') - 如果 JSON 中数值字段可能含小数,而目标列是
int,记得显式转换:CAST(JSON_VALUE(json_col, '$.count') AS int)—— 否则隐式转换失败会报错
JSON_VALUE 和 JSON_QUERY 的分工边界在哪
这是最容易混淆的一点:两者输入参数完全一样,但语义截然不同。
-
JSON_VALUE只能返回字符串/数字/布尔/null —— 即使原始 JSON 里是"123"(字符串)或123(数字),返回值都是varchar(4000)类型(除非你 CAST) -
JSON_QUERY返回的是“未解析的 JSON 片段”,保留原始结构和引号,可用于嵌套查询或拼接。例如JSON_QUERY(json_col, '$.address')返回{"city":"Beijing","zip":"100000"}这个完整子对象字符串 - 误用典型:想取
$.items数组并展开,却用了JSON_VALUE→ 得到NULL;正确做法是先JSON_QUERY取出数组字符串,再配合OPENJSON解析
真正难的不是语法,而是确认那串文本确实是 JSON —— 多数线上问题都卡在数据入库时没校验,导致 ISJSON() 批量失败。别跳过这一步。










