sql server json处理必须用nvarchar(max)参数,先isjson()校验再解析;json_value仅取标量且路径需转义中文键名,多字段优先openjson+with,嵌套数组用cross apply分层展开。

参数必须声明为 NVARCHAR(MAX),不能用 VARCHAR 或 NVARCHAR(4000)
SQL Server 没有原生 JSON 类型,所有 JSON 都得靠字符串承载。用 VARCHAR 会导致中文键名(如"收货地址")、emoji 或 Base64 字段乱码或截断;用 TEXT 或 XML 类型则直接不兼容 JSON_VALUE 和 OPENJSON 函数。
长度也不能写 NVARCHAR(4000)——哪怕你“确定”不会超长,实际运行中含图片 Base64 的 JSON 很容易踩坑。正确写法只有:@json_param NVARCHAR(MAX)。
解析前必须调 ISJSON() 校验,否则 JSON_VALUE 和 OPENJSON 静默返回 NULL
ISJSON(@json_param) 返回 1 才代表可安全解析;返回 0 或 NULL 都不可信。用户传来的 JSON 可能缺引号、逗号错位、含非法控制字符,这些错误不会触发异常,只会让后续函数返回 NULL,极易误判为“字段为空”。
别依赖 TRY...CATCH 捕获 JSON 解析错误——JSON_VALUE 和 OPENJSON 本身不抛异常,ISJSON() 是唯一可靠前置检查。
详细的 Three.js 3D 图形参考,涵盖场景设置、相机、几何体、材质、光照、动画、控制器、加载器、数学工具和调试。
JSON_VALUE 只能取标量,路径写错或类型不匹配就返回 NULL
它只接受指向字符串、数字、布尔或 null 的路径;一旦路径指向对象(如 $.address)或数组(如 $.tags),结果就是 NULL,不是函数失效,而是语义不匹配。
- 中文键名必须转义:
'$.["收货地址"]',不能写'$.收货地址' - 数组元素用方括号:
'$[0].amount'提取第一个订单金额 - 返回值默认是
NVARCHAR(4000),字段可能超长时要显式转换:CAST(JSON_VALUE(@json, '$.desc') AS NVARCHAR(MAX)) - 别在
WHERE里裸用:WHERE JSON_VALUE(data, '$.status') = 'done'——没索引时每次全表解析 JSON,性能崩得快
提取多字段或嵌套结构,优先用 OPENJSON + WITH 子句
从同一段 JSON 提取 3 个以上字段,或字段跨不同层级(如 $.user.name 和 $.order.items[0].price),硬写一堆 JSON_VALUE 不仅难维护,CPU 开销也高。
OPENJSON 必须配 WITH 才能映射成可用列;不带 WITH 只返回 key/value/type 三列,全是字符串,没法直接用于业务逻辑。
嵌套数组要用 CROSS APPLY 分层展开:先 OPENJSON(@json, '$.orders'),再对每行 CROSS APPLY OPENJSON(value, '$.items')。注意路径必须以 $ 开头:'$.user.name' 对,'user.name' 静默失败。
sys.databases 的 compatibility_level),且所有解析动作都基于字符串实时进行——同一段 JSON 被反复解析十几次,就真做了十几次完整解析。这种场景下,一次性 OPENJSON 展开到临时表,再查,才是实际可行的路。










