必须用 NVARCHAR(MAX) 声明 JSON 参数并开头调 ISJSON() 校验,否则 JSON_VALUE/OPENJSON 静默返回 NULL;中文键名需转义,数组用方括号,超长字段须显式 CAST;多字段提取优先 OPENJSON + WITH;重复解析应避免以节省 CPU。

必须用 NVARCHAR(MAX) 声明参数,且开头就调 ISJSON() 校验——漏掉任一环节,JSON_VALUE 和 OPENJSON 都会静默返回 NULL,而不是报错。
参数声明和合法性校验不能省
SQL Server 没有原生 JSON 参数类型,所有 JSON 都得靠字符串承载。用 VARCHAR 会导致中文键名(如 "收货地址")、emoji 或 Base64 字段乱码;用 TEXT 或 XML 则直接不兼容 JSON 函数。
-
@json_param NVARCHAR(MAX)是唯一安全写法;NVARCHAR(4000)看似够用,但含图片 Base64 的 JSON 很容易超长 - 必须在存储过程开头加判断:
IF ISJSON(@json_param) = 0 BEGIN RAISERROR('Invalid JSON', 16, 1) RETURN END -
ISJSON()返回1才代表可安全解析;返回0或NULL都不可信 - 别指望
TRY...CATCH捕获 JSON 解析失败——JSON_VALUE和OPENJSON本身不抛异常,只静默返NULL
提取单个字段优先用 JSON_VALUE,但路径和类型必须匹配
JSON_VALUE 只返回标量值(字符串、数字、布尔、null),一旦路径指向对象或数组,结果就是 NULL,不是函数失效,而是语义不匹配。
使用 JSON Schema 验证 JSON 数据,从示例 JSON 生成 schema,并将其转换为 TypeScript 接口、Python 数据类或 Markdown 文档。
- 正确:
JSON_VALUE(@json, '$.name')→ 返回'Alice'(字符串) - 错误:
JSON_VALUE(@json, '$.address')→ 若address是对象,返回NULL;应改用JSON_QUERY - 中文键名必须转义:
'$.["收货地址"]',不能写'$.收货地址' - 数组元素用方括号:
'$[0].amount'提取第一个订单金额 - 返回值默认是
NVARCHAR(4000),字段可能超长时要显式转换:CAST(JSON_VALUE(@json, '$.desc') AS NVARCHAR(MAX))
多个字段或嵌套结构必须用 OPENJSON + WITH
从同一段 JSON 中提取 3 个以上字段,或字段来自不同层级(如 $.user.name 和 $.order.items[0].price),硬写一堆 JSON_VALUE 不仅难维护,CPU 开销也高。
-
OPENJSON必须配WITH子句才能映射成可用列;不带WITH只返回key/value/type三列,全是字符串,没法直接用于业务逻辑 - 路径必须以
$开头:'$.user.name'对,'user.name'静默失败 - 嵌套数组要用
CROSS APPLY分层展开:先OPENJSON(@json, '$.orders'),再对每行CROSS APPLY OPENJSON(value, '$.items') - 若 JSON 是纯数组(如
N'[{"id":1},{"id":2}]'),直接OPENJSON(@json)即可展开;若藏在对象下(如{ "data": [] }),必须写完整路径:OPENJSON(@json, '$.data')
JSON_OBJECT 在 SQL Server 2022 中用于构造输出,不用于解析输入
JSON_OBJECT 是 SQL Server 2022 新增的构造函数,用来把查询结果拼成 JSON 对象,比如 SELECT JSON_OBJECT('name': @name, 'id': @id)。它不参与参数解析,也不能替代 JSON_VALUE 或 OPENJSON。
- 它只接受表达式作为值,不接受 JSON 路径字符串
- 控制
NULL行为用NULL ON NULL(默认)或ABSENT ON NULL,但这是输出侧逻辑,与输入解析无关 - 别把它和
FOR JSON混用:前者拼单个对象,后者把整张结果集转 JSON 数组或对象
最常被忽略的一点:SQL Server 的 JSON 函数全部基于字符串解析,没有缓存机制。如果同一段 JSON 在一个存储过程中被反复解析,CPU 就白烧——一次性用 OPENJSON 展开,后续全走临时表或变量承接,别循环调用。

















