在SQL Server 2016中怎样编写存储过程实现JSON数据解析

老芳大大_1272

老芳大大_1272

2026-10-30

733人浏览

原创

必须用NVARCHAR(MAX)声明参数且第一步永远是ISJSON()校验,否则非法JSON会静默返回NULL;提取多字段优先用OPENJSON WITH;遍历数组须用CROSS APPLY分层展开;JSON_VALUE返回NULL无法区分缺失、null或空字符串。

在sql server 2016中怎样编写存储过程实现json数据解析

必须用 NVARCHAR(MAX) 声明参数,且第一步永远是 ISJSON() 校验——不校验就调 JSON_VALUE 或 OPENJSON,非法 JSON 会静默返回 NULL,查不到数据却无报错,这是最常踩的坑。

为什么 ISJSON() 是不可跳过的第一步

前端传来的 JSON 很容易是空字符串 ''、字符串 'null'、未转义双引号(如 "msg":"he\"llo"),这些都会让 ISJSON(@json) 返回 0。一旦跳过校验,后续所有解析函数都“假装正常”,但结果全为 NULL。

  • ISJSON(@json) = 1 才代表可安全进入解析流程;否则应直接 RETURN 或 THROW 50000, 'Invalid JSON', 1
  • 别在存储过程里反复调 ISJSON——只校验一次,后续所有操作都基于这个前提
  • 若参数来自外部 API,建议在应用层也加校验,避免无效 JSON 流入数据库层

提取多字段优先用 OPENJSON WITH,别堆 JSON_VALUE

要取 $.user.name、$.order.id、$.order.items[0].price 这类跨层级字段,硬写三个 JSON_VALUE 看似简单,但每次调用都会完整重解析整段 JSON 字符串,CPU 开销随字段数线性上涨。

  • 正确写法:OPENJSON(@json) WITH (user_name NVARCHAR(100) '$.user.name', order_id INT '$.order.id', first_price DECIMAL(10,2) '$.order.items[0].price')
  • 路径中某层缺失(如 user 不存在),对应列自动为 NULL,无需额外判空
  • 字段值可能超 4000 字符(如长描述、Base64 图片),必须显式声明为 NVARCHAR(MAX),否则被无声截断
  • 别漏掉 WITH 子句——没它的话 OPENJSON 只返回 key/value/type 三列字符串,没法直接 join 或 insert

遍历 JSON 数组必须用 CROSS APPLY 分层展开

想处理 $.orders 下每个订单,再遍历每个订单里的 items,千万别用 WHILE 循环拼索引路径,比如 '$.orders[' + CAST(@i AS VARCHAR) + '].id'——这既无法检测越界,又性能极差。

arcgis-js
arcgis-js

提供 ArcGIS Maps SDK for JavaScript 开发辅助,涵盖 2D/3D 地图视图、图层管理、数据可视化、空间分析等功能模块的参考和示例指导。

下载
  • 标准写法:先 OPENJSON(@json, '$.orders') 展开订单列表,再对每行 CROSS APPLY OPENJSON(value, '$.items') 展开商品
  • 外层路径必须精确到数组本身,不能写成 '$.orders.items'——那会把整个数组当对象解析,只出一行
  • 如果 JSON 顶层就是数组(如 [{"id":1},{"id":2}]),直接 OPENJSON(@json) 即可,不加第二参数
  • 数组元素为空时,CROSS APPLY 自动跳过该行,不会报错

JSON_VALUE 返回 NULL 不等于字段缺失

JSON_VALUE(@json, '$.status') 返回 NULL 有三种可能:路径不存在、原始值是 JSON null、原始值是空字符串 ""。你无法区分它们,所以不能拿 WHERE ... IS NULL 当“字段没传”来用。

  • 判断字段是否存在:用 ISJSON(JSON_QUERY(@json, '$.field')) = 1(JSON_QUERY 对不存在路径返回 NULL,而 ISJSON(NULL) 是 0)
  • 想区分空字符串和缺失:在 OPENJSON WITH 中设默认值,例如 status NVARCHAR(20) '$.status' DEFAULT 'pending'
  • 数字字段若原始 JSON 中带引号(如 "age": "25"),JSON_VALUE 返回字符串,需手动 TRY_CAST(... AS INT)
  • 在 WHERE 条件里裸用 JSON_VALUE(如 WHERE JSON_VALUE(data, '$.type') = 'user')会导致全表逐行解析,没索引时性能崩得快

真正复杂的嵌套校验、深度递归或模式匹配,SQL Server 的 JSON 函数并不擅长——它本质仍是字符串解析,没有真正的 JSON 类型语义。遇到这类需求,更稳的做法是在应用层解析后,只把关键字段透传进存储过程做轻量处理。

相关文章

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

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

下载

相关标签:

js json 存储过程

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

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2023.08.07

2215

5

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.23

3502

1

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

2023.10.13

1176

3

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

2025.09.10

4019

7

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.11

6091

4

数据库三范式
数据库三范式

数据库三范式是一种设计规范,用于规范化关系型数据库中的数据结构,它通过消除冗余数据、提高数据库性能和数据一致性,提供了一种有效的数据库设计方法。本专题提供数据库三范式相关的文章、下载和课程。

2023.06.29

2905

3

如何删除数据库
如何删除数据库

删除数据库是指在MySQL中完全移除一个数据库及其所包含的所有数据和结构,作用包括:1、释放存储空间;2、确保数据的安全性;3、提高数据库的整体性能,加速查询和操作的执行速度。尽管删除数据库具有一些好处,但在执行任何删除操作之前,务必谨慎操作,并备份重要的数据。删除数据库将永久性地删除所有相关数据和结构,无法回滚。

2023.08.14

4061

10

vb怎么连接数据库
vb怎么连接数据库

在VB中,连接数据库通常使用ADO(ActiveX 数据对象)或 DAO(Data Access Objects)这两个技术来实现:1、引入ADO库;2、创建ADO连接对象;3、配置连接字符串;4、打开连接;5、执行SQL语句;6、处理查询结果;7、关闭连接即可。

2023.08.31

3251

3

MySQL恢复数据库
MySQL恢复数据库

MySQL恢复数据库的方法有使用物理备份恢复、使用逻辑备份恢复、使用二进制日志恢复和使用数据库复制进行恢复等。本专题为大家提供MySQL数据库相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.05

1027

5

热门下载

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

精品课程

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

共101课时 | 21.2万人学习

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

共39课时 | 4.9万人学习