如何在SQL存储过程中接收并解析JSON字符串

秋芳君_1177

秋芳君_1177

2026-10-10

894人浏览

原创

必须用 nvarchar(max) 声明 json 参数并前置 isjson() 校验,否则 json_value/openjson 静默返回 null;中文键名需转义,数组用方括号,多字段提取须用 openjson with,解析结果应暂存再提交以保障事务一致性。

如何在sql存储过程中接收并解析json字符串

必须用 NVARCHAR(MAX) 声明参数,且解析前不校验 ISJSON() 就等于埋雷——JSON_VALUE 和 OPENJSON 全部静默返回 NULL,不是报错,而是“假装成功”。

参数声明必须是 NVARCHAR(MAX),不能是 VARCHAR 或 NVARCHAR(4000)

SQL Server 没有原生 JSON 类型,所有 JSON 都靠字符串承载。用 VARCHAR 会导致中文键名(如 "收货地址")、emoji 或 Base64 字段乱码或截断;用 TEXT 或 XML 类型则直接不兼容 JSON 函数。

路径和内容内部按 Unicode 解析,NVARCHAR 是强制要求。长度不能写 NVARCHAR(4000)——哪怕你“确定”不会超长,实际运行中含图片 Base64 的 JSON 很容易踩坑。

  • 正确:@json_param NVARCHAR(MAX)
  • 错误:@json_param VARCHAR(8000)、@json_param TEXT、@json_param NVARCHAR(4000)

ISJSON() 校验不是可选步骤,是执行前必做的安全闸

漏掉这一步,后续所有 JSON_VALUE、OPENJSON 调用都会静默返回 NULL,而不是抛异常。你看到的“字段为空”,很可能是 JSON 格式非法,而非业务数据缺失。

Browser Js
Browser Js

轻量级CDP浏览器控制,适用于AI代理。相较于内置浏览器工具,token消耗降低3‑10倍,仅在浏览时使用。

下载
  • 在存储过程开头立即校验:IF ISJSON(@json_param) = 0 THROW 50000, 'Invalid JSON input', 1;
  • 不要只在开发环境校验——生产环境里前端传参拼错一个逗号、多一个逗号、少一个引号,都足以让整个解析链失效
  • 注意:空字符串 ''、NULL、纯空白都返回 0,需提前判断是否允许空输入

取单个标量值用 JSON_VALUE,但路径写错或类型不匹配就返回 NULL

JSON_VALUE 只接受指向字符串、数字、布尔或 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 三列,全是字符串,没法直接用于业务逻辑
  • 路径必须以 $ 开头:'$.user.name' 对,'user.name' 静默失败
  • 嵌套数组要用 CROSS APPLY 分层展开:先 OPENJSON(@json, '$.orders'),再对每行 CROSS APPLY OPENJSON(value, '$.items')
  • 示例:OPENJSON(@json) WITH (name NVARCHAR(50) '$.user.name', price DECIMAL(10,2) '$.order.items[0].price')

最容易被忽略的是:JSON 解析本身没有事务性,OPENJSON 出错不会回滚前面已插入的数据;如果业务逻辑涉及主子表写入,必须把 JSON 解析结果先存到临时表或表变量里,验证通过后再批量提交——否则部分成功、部分失败的状态极难追溯。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

js json 存储过程

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

2023.10.12

4123

8

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.27

871

4

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

2024.02.23

1069

5

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

6001

10

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

2883

4

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

2024.04.07

5980

11

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

2024.04.29

8001

6

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1090

5

sql中删除一列的命令是什么
sql中删除一列的命令是什么

在sql中,使用alter table语句可以删除一列,语法为:alter table table_name drop column column_name。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

952

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 20.9万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 4.8万人学习