sql server 存储过程接收 json 必须用 nvarchar(max),否则中文、emoji、长 base64 会截断或乱码;需先 isjson 校验,批量解析优先用 openjson 配合 with 显式声明类型与路径。

SQL Server 存储过程必须用 NVARCHAR(MAX) 接收 JSON 参数
传入的 JSON 字符串若被声明为 VARCHAR 或固定长度 NVARCHAR(4000),中文、emoji、长 Base64 字段会截断或乱码,JSON_VALUE 和 OPENJSON 随后返回不可靠结果——不是函数失效,而是输入已损坏。
- 必须声明为
@json_input NVARCHAR(MAX) - 开头立刻校验:
IF ISJSON(@json_input) = 0 BEGIN RAISERROR('Invalid JSON', 16, 1) RETURN END - 别用
TEXT或XML类型,它们不兼容 JSON 函数
批量写入优先用 OPENJSON,别循环调用 JSON_VALUE
想从 JSON 数组里取 3 个以上字段,或者字段跨层级(如 $.user.name 和 $.items[0].price),硬写多个 JSON_VALUE 不仅难维护,还会对同一段 JSON 重复解析十几次——SQL Server 没缓存,每次都是全量字符串扫描。
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
- 数组直接展开:
OPENJSON(@json_input, '$.orders')(路径指向数组) - 对象需指定根路径:
OPENJSON(@json_input, '$')再配合WITH映射字段 -
WITH子句必须显式声明类型和路径,例如order_id INT '$.id',否则只返回原始字符串三列 - 嵌套字段路径写全:
addr_city NVARCHAR(50) '$.address.city',中间任一层为null,该列就是null
Oracle 21c 批量写入必须声明参数为 JSON 类型
如果还用 CLOB 或 VARCHAR2 声明参数,JSON_TABLE 虽能运行,但失去二进制解析优势、无法命中 JSON 函数索引,且 JSON_EXISTS 对合法路径也返回 FALSE——Oracle 静默当普通字符串处理,不报错。
- 正确声明:
json_input JSON - 预检路径是否存在:
JSON_EXISTS(json_input, '$.items'),别依赖JSON_VALUE返回NULL判断字段缺失 - 中文键名必须双引号:
'$.["收货地址"]',写成'$.收货地址'直接失败 - 提取多字段/数组统一走
JSON_TABLE,例如:SELECT jt.name, jt.price FROM JSON_TABLE(json_input, '$.items' COLUMNS (name VARCHAR2(100) PATH '$.name', price NUMBER PATH '$.price')) jt
MySQL 5.7+ 用 JSON_TABLE 或循环 JSON_EXTRACT 都行,但注意数组索引
MySQL 不强制要求参数类型,但 JSON_EXTRACT 返回带引号字符串,JSON_UNQUOTE 必须配套使用;JSON_LENGTH 计算数组长度时路径不能漏掉 $ 前缀。
- 数组遍历写法:
WHILE i - 路径拼接要小心:
CONCAT('$.items[', i, '].name'),别漏方括号 - MySQL 8.0+ 推荐
JSON_TABLE替代循环,性能更稳、语法更清晰 - 主子表关联字段(如订单号)需在循环内手动提取并复用,别指望自动继承
JSON 类型参数一旦写错,所有后续判断都静默失效;MySQL 的 JSON_EXTRACT 返回值默认带双引号,漏掉 JSON_UNQUOTE 会导致插入空字符串而非真实值。










