讲师中心 微信公众号
AI工具推荐 视频效率加速

如何在SQL Server 2022存储过程中实现高效的JSON增强操作

大雪酱_5755

大雪酱_5755

发布时间:2026-10-22 11:00:23

|

309人浏览过

|

来源于php中文网

原创

应将高频过滤字段持久化为计算列并建索引,而非在WHERE中直接用JSON_VALUE;批量导入优先用TVP而非OPENJSON解析JSON字符串;JSON_MODIFY更新前需校验路径存在;SQL Server 2022不支持json数据类型。

如何在sql server 2022存储过程中实现高效的json增强操作

用 JSON_VALUE 和 JSON_QUERY 提取字段时,别直接嵌套在 WHERE 中

SQL Server 2022 的 JSON_VALUE 在 WHERE 子句里直接使用(如 WHERE JSON_VALUE(data, '$.price') > 100)会导致全表扫描——因为函数无法利用索引,且每次都要解析整个 JSON 字符串。

真正高效的做法是:提前把关键字段持久化为计算列并建索引。例如:

ALTER TABLE products
ADD price_as_num AS CAST(JSON_VALUE(data, '$.price') AS DECIMAL(10,2)) PERSISTED;
<p>CREATE INDEX IX_products_price_as_num ON products(price_as_num);

这样后续查询就能走索引,而不是每次调用 JSON_VALUE 去解析文本。

  • 只对高频过滤/排序的 JSON 字段做持久化,避免冗余列膨胀
  • PERSISTED 是必须的,否则索引无法建立在计算列上
  • 注意 JSON_VALUE 返回的是字符串,务必显式 CAST 成目标类型,否则比较行为可能出人意料

批量导入 JSON 数组?优先用 OPENJSON + 表值参数,别拼字符串

常见错误是把前端传来的 JSON 数组(如 [{"id":1,"name":"A"},{"id":2,"name":"B"}])当字符串塞进存储过程,再用 OPENJSON(@json) 解析——这在高并发下会显著拖慢性能,因为每次调用都触发 JSON 解析和内存分配。

更优路径是让应用层把 JSON 数组反序列化后,用表值参数(TVP)传入。SQL Server 2022 完全支持 TVP 与 OPENJSON 协同:

-- 假设已定义类型: CREATE TYPE ProductList AS TABLE (id INT, name NVARCHAR(50));
CREATE PROCEDURE sp_upsert_products
  @products ProductList READONLY
AS
BEGIN
  MERGE products AS t
  USING @products AS s ON t.id = s.id
  WHEN MATCHED THEN UPDATE SET name = s.name
  WHEN NOT MATCHED THEN INSERT (id, name) VALUES (s.id, s.name);
END;

这样绕开了 JSON 解析开销,也规避了 SQL 注入风险。

chartjs-reporter
chartjs-reporter

此技能用于在用户需要将结构化数据(查询结果、CSV 摘要、JSON 记录或 Python 字典/列表)转换为独立的 HTML 页面时使用。

下载
  • TVP 需提前在数据库中定义类型,不能临时创建
  • Node.js / .NET 客户端需用对应驱动支持 TVP(tedious、SqlClient 均支持)
  • 如果必须用 JSON 入参,至少加 WITH 子句明确 schema,避免 OPENJSON 自动推断类型带来的隐式转换开销

JSON_MODIFY 更新深层嵌套字段时,路径写错会静默失败

JSON_MODIFY 对不存在的路径默认不报错,而是原样返回输入 JSON——比如想更新 $.specs.wheelSize,但 specs 对象根本不存在,结果就是什么都没改,还看不出异常。

安全做法是分两步:先用 ISJSON + JSON_VALUE 确认路径存在,再执行修改;或用 JSON_MODIFY 的 append 模式配合条件判断:

DECLARE @data NVARCHAR(MAX) = '{"name":"bike"}';
SET @data = JSON_MODIFY(
  @data,
  'append $.tags',
  'new'
);
-- 这会追加到 tags 数组末尾;如果 tags 不存在,会自动创建数组
  • 用 append $. 路径前缀可避免“父对象不存在”导致的静默失效
  • 更新数组元素要用数组索引(如 $[0].name),别用点号路径
  • JSON_MODIFY 不支持通配符或动态索引,想批量更新数组项得靠 OPENJSON + FOR JSON 重构

SQL Server 2022 的 JSON 数据类型不是万能加速器

2025 引入的 json 数据类型(二进制存储)确实在读取性能上有提升,但它在 2022 版本中并不可用——强行在 2022 上声明 json 列会报错 Incorrect syntax near 'json'。

当前能用的只有 NVARCHAR(MAX) 存 JSON 文本,所有函数(JSON_VALUE、JSON_QUERY 等)也都基于此。所谓“JSON 类型支持”,是 2025+ 才落地的特性。

  • 别被文档标题误导,检查 SELECT @@VERSION 确认真实版本
  • 2022 中唯一能加速 JSON 查询的方式,还是前面说的持久化计算列 + 索引
  • 如果升级无望,又需要高频 JSON 查询,考虑把部分结构扁平化到关系列,而非强依赖 JSON 函数

真正卡住性能的往往不是 JSON 功能本身,而是没意识到 JSON_VALUE 在 WHERE 里等于放弃索引,或者把 JSON 当成银弹去存一切字段——该拆的关系字段,迟早得拆。

热门AI工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

相关专题

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

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

2135

2023.08.07

json是什么
json是什么

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

3302

2023.08.23

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

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

1116

2023.10.13

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

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

3779

2025.09.10

sqlserver和mysql区别
sqlserver和mysql区别

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

5691

2023.08.11

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

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

2765

2023.06.29

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

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

3961

2023.08.14

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

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

3051

2023.08.31

Playwright 测试失败怎么办
Playwright 测试失败怎么办

Playwright测试失败专题汇集超时、定位器匹配、浏览器提前关闭、依赖与插件配置、文件上传、SSL及Docker启动等故障文章,并介绍通过截图、报告和Trace定位错误。

20

2026.10.21

热门下载

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

精品课程

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

共101课时 | 21.1万人学习

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

共39课时 | 4.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn