SQL Server存储过程解析JSON需用NVARCHAR(MAX)参数并先ISJSON校验,嵌套结构用OPENJSON展开;Oracle 21c必须声明JSON类型参数,否则JSON_EXISTS返回FALSE、JSON_VALUE全为NULL;MySQL数组遍历需IS_ARRAY校验并用JSON_UNQUOTE去引号。

必须先确认你用的是哪个数据库——MySQL、SQL Server 和 Oracle 对 JSON 的解析逻辑、函数名、类型要求和性能陷阱全都不一样,混用会直接导致 JSON_VALUE 返回 NULL 却不报错、路径始终匹配失败、或索引完全失效。
SQL Server 存储过程中传入 JSON 字符串怎么安全解析?
SQL Server 不强制参数类型为 json(2025 才正式支持该类型),所以绝大多数存储过程仍用 NVARCHAR(MAX) 接收 JSON 字符串。但这就带来两个关键问题:一是 ISJSON(@json) 必须放在开头校验,否则后续所有 JSON_VALUE 都可能静默失败;二是嵌套结构不能靠多个 JSON_VALUE 硬拼,得用 OPENJSON 一次性展开。
-
ISJSON(@json) <> 1时直接RETURN或抛错,别等后面字段取不到再处理 - 标量字段(如
$.name)用JSON_VALUE(@json, '$.name'),但注意它对空字符串、null、路径不存在三者都返回NULL,无法区分语义 - 含对象或数组的字段(如
$.address或$.tags)必须用JSON_QUERY(@json, '$.address'),否则JSON_VALUE会把整个对象转成字符串再截断 - 要提取 3 个以上字段,或字段来自不同层级(比如
$.user.id和$.order.items[0].price),写OPENJSON(@json) WITH (...),别堆JSON_VALUE调用——每次调用都会重新解析整段 JSON
Oracle 21c 存储过程里 JSON 参数类型写错会怎样?
Oracle 21c 要发挥原生 JSON 解析能力,参数声明必须是 JSON 类型,写成 CLOB 或 VARCHAR2 看似能跑通,实则彻底失效:类型校验跳过、函数索引不可用、JSON_EXISTS 永远返回 FALSE、JSON_VALUE 全部返回 NULL——而且全程不报任何错误。
将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。
- 正确声明:
json_input JSON;错误声明:json_input CLOB或json_input VARCHAR2(32767) - 路径含中文或特殊字符必须用双引号包裹,例如
'$.["收货地址"]',写成'$.收货地址'会直接不匹配 - 用
JSON_EXISTS(json_input, '$.mobile')先判断字段是否存在,再用JSON_VALUE(... RETURNING VARCHAR2)取值,避免把“没传”和“传了 null”当成一回事 - 数组访问从 0 开始:
'$[0].name'是第一个元素,'$[1]'才是第二个
MySQL 存储过程解析 JSON 数组为什么总少一条?
MySQL 8.0+ 的 JSON_LENGTH() 在计算数组长度时,如果传入的是对象(不是数组),会返回 NULL,而循环条件 WHILE i < JSON_LENGTH(json, '$.items') 中 NULL 参与比较结果恒为 FALSE,导致循环直接跳过——看起来就是“数组没被遍历”。另外,JSON_EXTRACT 返回带引号的字符串,比如 "John",直接插入 VARCHAR 字段会多出双引号。
- 数组长度校验必须加
IS_ARRAY(JSON_EXTRACT(json, '$.items')) = 1,不能只信JSON_LENGTH - 取字符串值一律套
JSON_UNQUOTE(JSON_EXTRACT(...)),否则存进去是"value"而不是value - 遍历数组推荐用
JSON_TABLE替代手工WHILE循环,语法更稳、性能更好、还支持LEFT JOIN补空 - 路径写错(比如把
'$.data[0].id'写成'$.data.id')时JSON_EXTRACT返回NULL,但不会提示哪里错了——建议先用SELECT JSON_EXTRACT(@json, '$.data')分层调试
最常被忽略的是:所有数据库中,JSON 路径表达式里的键名一旦含空格、中文、短横线或点号,就必须用双引号包在方括号里,比如 '$.["order-id"]' 或 '$.["用户信息"]',漏掉引号就等于路径无效——而错误表现永远是 NULL,不是报错。

















