json_value静默返回null,isjson()是唯一提前校验非法json的手段;必须用nvarchar(max)传参,避免截断乱码;isjson()需在json_value前调用并配合非空判断;路径错误、类型不匹配等均返回null;高频解析应改用openjson提升性能。

JSON_VALUE 不会报错,只静默返回 NULL;ISJSON() 是唯一能提前拦住非法输入的关卡。
SQL Server 存储过程中传入 JSON 字符串必须用 NVARCHAR(MAX)
SQL Server 没有原生 JSON 参数类型,所有 JSON 都得走字符串通道。若误用 VARCHAR,中文键名、emoji 或带 Unicode 的值会被截断或乱码——JSON_VALUE 后续解析时路径匹配直接失效。
常见错误:
• 用 TEXT 或 XML 类型接收 JSON 入参 → 函数不兼容,报错
• 声明为 NVARCHAR(200) → 长 JSON(如含 Base64 图片)被截断,ISJSON() 可能返回 1,但实际内容已损坏
ISJSON() 必须在 JSON_VALUE 之前调用
JSON_VALUE 对非法 JSON 不抛异常,也不警告,只返回 NULL。你看到 NULL,无法区分是“字段不存在”还是“根本不是 JSON”。
正确做法:
• 第一行就写 IF ISJSON(@json_param) = 0 BEGIN RAISERROR('Invalid JSON', 16, 1) RETURN END
• 注意:ISJSON(NULL) 返回 NULL,不是 0,所以还得额外判断 @json_param IS NOT NULL
• 空字符串 '' 返回 0,'null'(小写)返回 1 —— 这两个语义完全不同,不能混为一谈
路径写错或中文键名没转义,JSON_VALUE 一样返回 NULL
路径错误不是语法错误,ISJSON() 拦不住。
这些情况都返回 NULL,且无提示:
• 路径写成 '$.name',但实际 JSON 是 {"Name": "Alice"}(大小写敏感)
• 中文键名写成 '$.收货地址',正确应为 '$.["收货地址"]'
• 提取对象或数组(如 '$.address')却用 JSON_VALUE → 它只认标量,对象/数组一律 NULL,该用 JSON_QUERY
• 数组索引越界,比如 '$[99].id' 对只有 3 个元素的数组 → NULL,不是错误
同一段 JSON 被反复解析,性能会掉得很快
JSON_VALUE 每次调用都完整解析整段字符串,没有缓存。一个存储过程里写 8 次 JSON_VALUE(@p, '$.x'),等于解析 8 遍。
更稳的替代方案:
• 提取 ≥3 个字段时,改用 OPENJSON(@json_param) WITH (...) 一次解析
• OPENJSON 自动处理缺失键映射为 NULL,还能声明类型(如 INT、NVARCHAR(50)),比连写一堆 JSON_VALUE 更清晰、更快
• 注意:OPENJSON 是行集函数,不能直接赋值给变量,得配 SELECT INTO 或插入临时表
ISJSON() 过了,只代表语法合法;路径对不对、字段存不存在、类型匹不匹配,全得靠后续逻辑兜底。别让 NULL 成为默认 fallback。










