SQL存储过程如何接收JSON参数并解析数据?

夏芳姑娘_6477

夏芳姑娘_6477

2026-08-02

839人浏览

原创

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

sql存储过程如何接收json参数并解析数据?

参数必须声明为 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() 是唯一可靠前置检查。

Comprehensive Three.js 3D graphics reference
Comprehensive Three.js 3D graphics reference

详细的 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' 静默失败。

复杂点在于兼容级别必须 ≥130(查 sys.databases 的 compatibility_level),且所有解析动作都基于字符串实时进行——同一段 JSON 被反复解析十几次,就真做了十几次完整解析。这种场景下,一次性 OPENJSON 展开到临时表,再查,才是实际可行的路。

相关文章

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

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

下载

相关标签:

json 存储过程 js

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系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

3903

8

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

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

2023.10.27

831

4

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

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

2024.02.23

1009

5

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

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

2024.03.06

5721

10

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

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

2024.03.06

2683

4

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

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

2024.04.07

5720

11

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

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

2024.04.29

7541

6

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

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

2024.04.29

1030

5

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

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

2024.04.29

892

5

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程