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

SQL Server如何通过函数解析JSON数组_使用OPENJSON函数处理

秋涛同学_6722

秋涛同学_6722

发布时间:2026-05-22 13:36:20

|

867人浏览过

|

来源于php中文网

原创

OPENJSON不加WITH只能返回key、value、type三列,无法用于业务查询;必须用WITH显式声明字段名、类型及JSON路径(如id INT '$.id'),路径须以$开头,数组需指定路径或用CROSS APPLY分层展开。

sql server如何通过函数解析json数组_使用openjson函数处理

OPENJSON不加WITH只能看结构,不能当业务表用

直接执行 OPENJSON(@json) 只会返回三列:key、value、type,看着像解析成功了,但根本没法 JOIN、WHERE 或插入目标表。你看到的“数据没出来”,90%是漏写了 WITH 子句。

必须显式声明字段名、类型和路径,例如:

SELECT * FROM OPENJSON(@json) 
WITH (id INT '$.id', name NVARCHAR(50) '$.name', active BIT '$.is_active');
  • WITH 是强制项,不是可选项
  • 列名可以和 JSON key 不同(比如 JSON 里是 user_id,你映射成 id INT '$.user_id' 完全合法)
  • 路径必须以 $ 开头,写成 'id INT 'user_id'' 或 'id INT '.user_id'' 都静默返回 NULL

JSON数组在根层级 vs 嵌套在对象里,调用方式完全不同

如果 JSON 是纯数组:N'[{"id":1},{"id":2}]',直接 OPENJSON(@json) 就能展开成两行;但如果数组藏在对象下:N'{"data":[{"id":1},{"id":2}]}',就必须指定路径:OPENJSON(@json, '$.data'),否则只解析外层对象,data 数组本身被当做一个值(type = 4),不会展开。

  • 数组索引从 0 开始:'$[0].name' 才是第一个元素的 name,别写 '$[1].name'
  • 传入非数组/非对象的 JSON(比如字符串 "hello")会导致 OPENJSON 返回空结果集,不报错也不提示
  • 调试时先用 ISJSON(@json) 确认输入合法,再查 sys.dm_exec_describe_first_result_set(N'SELECT * FROM OPENJSON(@j)', N'@j NVARCHAR(MAX)', 0) 看实际输出结构

嵌套数组必须用CROSS APPLY分层展开,不能靠一层WITH硬写

面对这种结构:{"orders": [{"id":1,"items":[{"sku":"A"},{"sku":"B"}]},{"id":2,"items":[{"sku":"C"}]}]},别试图在第一层 WITH 里写 sku NVARCHAR(20) '$.orders[0].items[0].sku'——这只会取到第一个订单的第一个商品,且无法关联多行数据。

dmap-jsapi-skill
dmap-jsapi-skill

DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。

下载

正确做法是分两步:

SELECT o.id, i.sku
FROM OPENJSON(@json, '$.orders') 
  WITH (id INT '$.id') AS o
CROSS APPLY OPENJSON(@json, '$.orders[' + CAST(o.id - 1 AS VARCHAR) + '].items') 
  WITH (sku NVARCHAR(20) '$.sku') AS i;
  • 更稳的方式是先展开 orders,再对每行结果 CROSS APPLY OPENJSON(value, '$.items'),避免拼接路径出错
  • 注意 value 列来自上层 OPENJSON 的默认输出,它包含当前数组元素的完整 JSON 字符串
  • 深层嵌套会让 CROSS APPLY 链变长,容易漏掉某一层的 WITH 类型声明,导致整行 NULL

路径错、类型不匹配、空值都返回NULL,不是数据真为空

JSON_VALUE 和 OPENJSON 默认对路径错误、类型不兼容、JSON 值为 null 全部静默返回 NULL。你在查询里看到一堆 NULL,大概率不是数据缺失,而是路径写错了或者类型声明不合理。

  • 开发阶段务必在 JSON_VALUE 后加 ERROR ON ERROR,例如:JSON_VALUE(@json, '$.user.profile.phone' ERROR ON ERROR),一错立刻中断并提示具体路径问题
  • OPENJSON 本身不支持 ERROR ON ERROR,但你可以用 JSON_VALUE 先抽几个关键字段验证路径是否可达
  • 类型要跟 JSON 实际值一致:JSON 里 "age": "25"(字符串)配 INT 会返回 NULL;"active": "true" 配 BIT 同样失败
  • 数据库兼容级别必须 ≥ 130,低于这个值 OPENJSON 函数根本不可用,查 SELECT compatibility_level FROM sys.databases WHERE name = DB_NAME() 确认

嵌套越深,路径和类型匹配的容错空间越小,一个点号位置错、一个引号漏掉、一个索引偏移没对齐,结果就是整列 NULL —— 而且你还看不出哪错了。

热门AI工具

更多
WorkBuddy

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

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

Seko
Seko Hot

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

Loomy
Loomy Hot

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

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

豆包大模型

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

DeepSeek

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

SkildArt
SkildArt Hot

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

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

相关专题

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

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

2135

2023.08.07

json是什么
json是什么

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

3262

2023.08.23

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

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

1096

2023.10.13

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

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

3739

2025.09.10

sqlserver和mysql区别
sqlserver和mysql区别

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

5631

2023.08.11

OpenJDK JVM参数怎么调优
OpenJDK JVM参数怎么调优

Java应用运行缓慢,如何调整JVM参数?本专题介绍OpenJDK JVM性能调优的基本流程,涵盖性能指标确认、运行数据采集、内存配置和垃圾回收分析,帮助你先定位瓶颈,再通过对照测试验证效果,避免直接套用参数而影响应用稳定性。

60

2026.10.16

OpenJDK怎么配置Java开发环境
OpenJDK怎么配置Java开发环境

怎样用OpenJDK搭建开发环境?本专题介绍版本选择、下载安装、环境变量配置和编译运行验证,帮助你理清JDK的作用及基本配置流程,并通过简单程序检查环境是否可用,为后续项目开发做好准备。

40

2026.10.16

OpenJDK怎么部署Java应用
OpenJDK怎么部署Java应用

Java项目开发完成后,怎样部署到目标环境并正常运行?本专题介绍OpenJDK应用部署流程,涵盖运行环境准备、版本兼容检查、应用打包、启动参数配置和日志查看,帮助你理清部署前后的操作顺序,减少环境差异造成的运行问题。

40

2026.10.16

Revel框架模板渲染与表单验证
Revel框架模板渲染与表单验证

本专题围绕Revel框架视图层开发,介绍模板语法、变量输出、布局复用、表单提交、参数绑定与验证规则,帮助开发者完成安全规范的页面交互。

20

2026.10.16

热门下载

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

精品课程

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

共101课时 | 21万人学习

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

共39课时 | 4.9万人学习

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

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