怎么在SQL Server 2022中利用存储过程进行JSON数据的增删改查?

浅瑶同学_5482

浅瑶同学_5482

2026-10-13

925人浏览

原创

sql server 2022 中 json 字段不支持原生 dml,所有增删改查均依赖字符串级函数:更新用 json_modify(需 lax 模式删键、append 增数组),查询用 json_value/json_query,解析用 openjson(配合 with 显式结构);高频查询须建 persisted 计算列+索引,操作前必校验 isjson,路径含特殊字符需双引号,输入类型必须为 nvarchar(max)。

怎么在sql server 2022中利用存储过程进行json数据的增删改查?

直接上结论:SQL Server 2022 中不能对 JSON 字段“原地增删改查”,必须用 JSON_MODIFY 做更新、OPENJSON 拆解后插入/删除、JSON_VALUE 提取查询——它没有 JSON 类型的 DML 语法,所有操作都基于字符串解析与重组。

怎么用存储过程更新 JSON 字段里的某个值

核心是 JSON_MODIFY,它只接受 NVARCHAR 输入,返回 NVARCHAR,不改变原始结构,但会把非标量值(如对象或数组)转成字符串再塞进去,容易踩坑。

  • 必须先确认字段是 NVARCHAR 类型,不是 VARCHAR;否则中文乱码、解析失败
  • 路径写错(比如写成 '$.user.name' 但实际是 '$.data.user.name')时,JSON_MODIFY 默认静默失败,返回原 JSON,不会报错
  • 想删一个键?用 JSON_MODIFY(@json, 'lax $.field', NULL),注意必须加 lax 前缀,strict 模式下 NULL 会被当字面量保留
  • 追加数组元素?JSON_MODIFY(@json, 'append $.tags', 'newtag'),但只能 append 到最外层数组;嵌套数组得先 JSON_QUERY 提出来再拼
  • 别在循环里反复调用 JSON_MODIFY 做批量更新——每次都是全量字符串重组,CPU 和内存开销陡增;一次性构造好新 JSON 再 UPDATE

怎么从 JSON 数组插入多条记录到关系表

别手写 WHILE + JSON_VALUE 模拟循环,这是最常见也最慢的写法。正确姿势是让 OPENJSON 一次性展开,交给 SQL 引擎做集合操作。

Wjs Uploading Video
Wjs Uploading Video

将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。

下载
  • 输入 JSON 是数组(如 N'[{"id":1,"val":"a"},{"id":2,"val":"b"}]'),直接 OPENJSON(@json),不用路径参数
  • 输入 JSON 是对象包数组(如 N'{"items":[{"id":1}...]}'),必须指定路径:OPENJSON(@json, '$.items')
  • WITH 子句里声明列类型要严丝合缝:比如 id INT '$.id',若 JSON 里 "id": "1"(字符串),不加 CAST 就是 NULL
  • 字段缺失不报错,对应列为 NULL;想过滤掉缺字段的行,得在 WHERE 里显式判断,比如 WHERE id IS NOT NULL
  • 如果要 INSERT 多张表(比如主表+明细表),先用 OPENJSON 展开到临时表或 CTE,再分别 JOIN 插入,避免重复解析

怎么安全地在 WHERE 条件里查 JSON 字段

JSON_VALUE 在 WHERE 里裸用等于自毁性能——没索引时每次都要全表解析 JSON 字符串,数据一过万就卡死。

  • 高频查询字段(如 $.order_id)必须建计算列:ALTER TABLE Orders ADD order_id AS JSON_VALUE(data, '$.order_id')
  • 然后在计算列上建索引:CREATE INDEX IX_Orders_order_id ON Orders(order_id),注意计算列必须是 PERSISTED 才能索引
  • WHERE 中用 WHERE JSON_VALUE(data, '$.status') = 'shipped' 只适用于低频或小表;大数据量必须走计算列+索引
  • 查数组是否包含某值?JSON_VALUE 不行,得用 OPENJSON 展开后 EXISTS 或 IN,或者等 SQL Server 2025 的 JSON_CONTAINS(当前预览版)
  • 路径含特殊字符(如 $.user-name)必须用双引号括起来:'$."user-name"',否则解析失败返回 NULL

为什么存储过程里处理 JSON 容易出错

根本原因是 JSON 解析行为高度依赖输入格式、路径合法性、类型匹配,而这些在 T-SQL 里没有编译期检查,全是运行时报错或静默失败。

  • 没做 ISJSON(@input) = 1 校验就直接传给 OPENJSON,遇到非法 JSON 会直接报错中断执行
  • 把 JSON_VALUE 当 JSON_QUERY 用:前者只取标量,后者取子对象/数组;误用导致 NULL 或截断
  • 忽略编码:输入 JSON 是 UTF-8 字节流但存成 NVARCHAR,SQL Server 会按 UCS-2 解码,可能丢字符或出
  • 兼容性级别低于 130(SQL Server 2016)时,所有 JSON 函数不可用;2022 默认是 160,但旧库迁移后可能仍是 140 或更低,务必查 SELECT compatibility_level FROM sys.databases
  • 存储过程参数传入 JSON 时,必须声明为 NVARCHAR(MAX),用 VARCHAR 或固定长度会截断

相关文章

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

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

下载

相关标签:

js json 存储过程

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

相关专题

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

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

2023.08.07

2075

5

json是什么
json是什么

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

2023.08.23

3082

1

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

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

2023.10.13

1036

3

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

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

2025.09.10

3519

7

sqlserver和mysql区别
sqlserver和mysql区别

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

2023.08.11

5271

4

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

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

2023.06.29

2605

3

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

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

2023.08.14

3841

10

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

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

2023.08.31

2851

3

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

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

2023.09.05

927

5

热门下载

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

精品课程

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

共101课时 | 20.9万人学习

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

共39课时 | 4.8万人学习