SQL Server如何使用APPLY替代子查询处理JSON_解析嵌套结构

夏磊小哥_9707

夏磊小哥_9707

2026-04-20

832人浏览

原创

OPENJSON + CROSS APPLY 是解析 SQL Server 多层嵌套 JSON 的标准解法,通过逐级展开 value 字段实现链式解析;硬套子查询因路径无法参数化而失败,JSON 路径必须为编译期常量。

sql server如何使用apply替代子查询处理json_解析嵌套结构

APPLY 是处理 SQL Server 中嵌套 JSON 的关键手段,尤其当 JSON_VALUE 无法直接展开数组、或需要逐层“钻取”动态结构时,CROSS APPLY 或 OUTER APPLY 几乎是唯一可靠的选择。硬套子查询会报错或返回空,因为 JSON 解析函数不能在子查询的 SELECT 列表里直接引用外层字段做路径拼接。

为什么不能用普通子查询解析 $.items[0].name 这类路径

子查询作用域隔离,无法把外层变量注入 JSON 路径字符串;JSON_VALUE(@json, '$.items[' + CAST(@i AS VARCHAR) + '].name') 这种写法在子查询中不被允许,SQL Server 会报 Invalid column name 或直接忽略变量。更本质的问题是:JSON 路径必须是编译期可确定的字符串字面量,不能是运行期拼接表达式(除非走 EXEC 动态 SQL,但那引入新风险)。

  • 路径字符串必须是常量,如 '$.items[0].name',不能是 '$.items[' + @idx + '].name'
  • JSON_VALUE 和 JSON_QUERY 都不支持参数化路径
  • 子查询里调用这些函数时,无法访问父查询的列值来构造路径

OPENJSON + CROSS APPLY 是标准解法

把 JSON 字符串先用 OPENJSON 拆成行集,再用 APPLY 对每一行继续解析其内部 JSON 字段——这是 SQL Server 处理多层嵌套的惯用链式模式。例如解析 $.data.boards 下每个 board 的 items 数组:

SELECT 
  b.name AS board_name,
  i.name AS item_name,
  cv.text AS column_text
FROM OPENJSON(@MondayComApi, '$.data.boards')
  WITH (name NVARCHAR(100) '$.name') AS b
CROSS APPLY OPENJSON(b.value, '$.items') 
  WITH (name NVARCHAR(100) '$.name') AS i
CROSS APPLY OPENJSON(i.value, '$.column_values')
  WITH (text NVARCHAR(100) '$.text') AS cv;
  • b.value 是每个 board 对象的完整 JSON 字符串,可再次传给 OPENJSON
  • 每级 APPLY 都基于上一级输出的 value 字段,形成“一层剥开一层”的解析流
  • 若某层 JSON 不存在(比如 items 是 null 或缺失),CROSS APPLY 会跳过该行;需保留则改用 OUTER APPLY

遇到 $.items[0] 这种固定索引时,别手动写死

写 '$.items[0].name' 看似简单,但一旦数组为空或 [0] 不存在,整个 JSON_VALUE 返回 NULL,且无法区分是字段为空还是路径根本不存在。更健壮的做法是先用 OPENJSON 展开数组,再用 ROW_NUMBER() 或条件过滤取首项:

Expanso yaml-to-json
Expanso yaml-to-json

使用 Expanso Edge 管道将 YAML 输入转换为 JSON 格式。

下载
SELECT TOP 1 
  JSON_VALUE(item.value, '$.name') AS name
FROM OPENJSON(@json, '$.items') AS item
ORDER BY CAST(JSON_VALUE(item.value, '$.id') AS INT);
  • 避免依赖 [0] 索引,JSON 数组顺序不保证,[0] 可能不是你想要的“第一个”
  • 用 TOP 1 + ORDER BY 显式控制取哪一条,语义清晰且可索引
  • 如果必须取索引为 0 的元素,先确认 ISJSON 和路径存在性:JSON_PATH_EXISTS(@json, '$.items[0]')(SQL Server 2022+)

性能陷阱:别在 WHERE 里反复调用 OPENJSON

对大表逐行执行 OPENJSON 开销极高,尤其是嵌套多层时。常见错误是把 OPENJSON 放在 WHERE 子句里做条件过滤:

-- ❌ 千万别这么写
WHERE JSON_VALUE(data, '$.user.address.city') = 'beijing'
  • 每次比较都触发完整 JSON 解析,无法走索引,CPU 和内存压力陡增
  • 正确做法:提前用计算列固化常用路径,例如 ALTER TABLE T ADD city AS JSON_VALUE(data, '$.user.address.city'),再对该列建索引
  • SQL Server 2022 起可用 JSON_PATH_EXISTS 快速判断路径是否存在,比 JSON_VALUE 轻量得多

真正难的不是语法,而是理解 OPENJSON 输出的 key、value、type 三列如何被下一级 APPLY 复用;很多人卡在没意识到 value 才是下一层要解析的 JSON 字符串,而误用了原始字段名。

相关文章

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

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

下载

相关标签:

js json

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

相关专题

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

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

2023.08.07

2295

5

json是什么
json是什么

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

2023.08.23

3762

1

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

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

2023.10.13

1256

3

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

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

2025.09.10

4379

7

sqlserver和mysql区别
sqlserver和mysql区别

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

2023.08.11

6611

4

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

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

2023.06.29

3125

3

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

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

2023.08.14

4181

10

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

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

2023.08.31

3511

3

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

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

2023.09.05

1087

5

热门下载

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

精品课程

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

共101课时 | 21.3万人学习

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

共39课时 | 4.9万人学习