如何在SQL Server中利用OPENJSON函数将JSON数组直接映射为关系表?

秋墨君_9115

秋墨君_9115

2026-06-07

621人浏览

原创

openjson必须配合with子句才能将json数组展开为关系行,否则仅返回key/value/type三列;with需精确指定路径、类型及嵌套结构,路径错误或缺失as json会导致null或截断。

如何在sql server中利用openjson函数将json数组直接映射为关系表?

OPENJSON 要求显式指定 WITH 子句才能映射字段

直接用 SELECT * FROM OPENJSON(@json) 只能得到键值对的三列结果(key、value、type),无法自动展开 JSON 数组元素为关系行。必须配合 WITH 子句声明目标列名、数据类型和 JSON 路径,SQL Server 才会把每个数组项解析成一行。

常见错误是漏写 WITH,或路径写成 '$.items[0].name' 这种固定下标——这只会取第一个元素,不是“映射整个数组”。

  • WITH 中的路径默认以 $ 为根,对数组而言就是遍历每一项,无需写索引
  • 若 JSON 是顶层对象包裹数组(如 {"data": [...]}),路径需写成 '$.data' AS JSON 先提取数组,再嵌套一次 OPENJSON
  • 字符串字段记得加 AS JSON 标识嵌套结构,否则会被当作文本截断

处理嵌套 JSON 对象时,WITH 中路径必须精确匹配层级

比如 JSON 数组中每个元素含 {"user": {"id": 1, "profile": {"email": "a@b.com"}}},想取出 user.id 和 user.profile.email,WITH 必须写成:

WITH (
    UserId INT '$.user.id',
    Email NVARCHAR(100) '$.user.profile.email'
)

路径不能简写为 '$.id' 或漏掉中间层级。SQL Server 不做字段名模糊匹配,路径错一位就返回 NULL。

一览运营宝
一览运营宝

一款面向视频内容运营的AI创作工具,可辅助进行视频内容策划、创作和运营工作,帮助内容团队提高视频生产效率。

下载
  • 路径支持通配符 $[*].field,但仅限顶层数组;嵌套数组需先用外层 OPENJSON 提取,再对 value 列二次解析
  • 日期字段建议用 DATETIME2 类型 + '$.date' 路径,避免因格式不统一转成字符串
  • 数值字段若可能为 null 或空字符串,类型选 INT 比 INT '$.x' DEFAULT 0 更安全——后者在值为 "" 时仍报错

性能关键:大 JSON 数组要避免多次 OPENJSON 嵌套调用

一个含 10000 个对象的 JSON 数组,如果对每个对象再调用一次 OPENJSON 解析其内部数组(比如 "tags": ["a","b"]),实际会触发 10000 × N 次解析,CPU 和内存开销陡增。

  • 优先用 AS JSON 把嵌套数组整体作为 NVARCHAR(MAX) 字段取出,后续用应用层或标量函数处理
  • 真需要展开多级,改用 CROSS APPLY 分两步:第一步展开外层数组,第二步对每行的 value 列再 OPENJSON
  • SQL Server 2016+ 的 OPENJSON 不支持并行执行,单次调用解析超 5MB JSON 时明显变慢,建议前置拆分

NULL 值和缺失字段的默认行为容易误判

OPENJSON 默认把缺失字段、null 值、空字符串都转成 SQL 的 NULL,且不报错。表结构若设了 NOT NULL 约束,插入时直接失败;若没设,业务逻辑可能拿不到预期默认值。

  • 用 DEFAULT 子句可覆盖:例如 Name NVARCHAR(50) '$.name' DEFAULT 'Unknown'
  • 但 DEFAULT 对 JSON null 无效,只对路径不存在或 value 为 NULL 生效;要区分 null 和缺失,得靠应用层或额外判断 type 列
  • 布尔值 JSON 写 true/false,SQL Server 会转成 1/0,类型必须声明为 BIT,写 INT 也能存但语义不清

实际映射最常卡在路径写错和嵌套层级没拆开,而不是语法不会——盯着 F12 看一眼原始 JSON 结构,手写路径比凭记忆靠谱。

相关文章

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

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

下载

相关标签:

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

相关专题

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

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

2023.08.07

2055

5

json是什么
json是什么

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

2023.08.23

3002

1

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

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

2023.10.13

1016

3

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

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

2025.09.10

3399

7

sqlserver和mysql区别
sqlserver和mysql区别

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

2023.08.11

5111

4

FrankenPHP集成Laravel详细教程
FrankenPHP集成Laravel详细教程

本专题提供FrankenPHP集成Laravel的详细配置指南,全面解析运行原理、开发环境搭建、Caddyfile配置、Octane工作模式、数据库连接、队列任务、定时任务和生产环境优化,解决部署过程中常见的报错与兼容性问题。

2026.10.08

40

20

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

2026.09.30

140

10

LLVM RISC-V参数配置教程
LLVM RISC-V参数配置教程

本专题介绍LLVM对RISC-V基础ISA和扩展的支持方式,涵盖RV32、RV64、标准扩展、实验性扩展、厂商扩展、-menable-experimental-extensions和版本差异。

2026.09.30

140

14

LLVM IR中间表示入门指南
LLVM IR中间表示入门指南

本专题整理LLVM IR的核心概念,包括中间表示作用、模块结构、函数、基本块、SSA形式、类型系统和常见语法,帮助新手理解LLVM编译流程中的关键层。

2026.09.30

100

12

热门下载

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

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.6万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.4万人学习