怎么在SQL Server 2016中直接查询JSON数据?

云丽小哥_1326

云丽小哥_1326

2026-09-15

823人浏览

原创

sql server中处理json必须用json_value提取标量值或openjson解析数组/对象;前者路径须以$开头、返回null不报错,后者需with子句定义结构;索引优化须通过persisted计算列实现。

怎么在sql server 2016中直接查询json数据?

直接查 JSON 字段,必须用 JSON_VALUEOPENJSON,不能用 WHERE column = 'xxx' 这种普通方式——SQL Server 不会自动解析字符串里的 JSON 结构。

JSON_VALUE 提取单个标量值(最常用)

适用于从 JSON 字符串里取一个字段,比如 "name""id" 或嵌套路径如 "address.city"。它只返回字符串、数字、布尔或 null,不支持数组或对象。

  • JSON_VALUE 第二个参数是 JSON 路径表达式,必须以 $ 开头,比如 '$.name''$.skills[0]'
  • 如果路径不存在或 JSON 无效,返回 NULL(不是报错),所以 WHERE 条件里要小心空值漏判
  • 不能用于超过 4000 字符的 JSON 字符串做索引查找——因为内部会截断,建议字段类型用 nvarchar(4000) 存短 JSON,长的才用 nvarchar(max)
  • 示例:SELECT id, JSON_VALUE(doc, '$.name') AS name FROM Families WHERE JSON_VALUE(doc, '$.isRegistered') = 'true'

OPENJSON 配合 WITH 解析整个 JSON 对象或数组

当你需要把 JSON 数组展开成行,或一次性提取多个字段(尤其顶层是数组时),OPENJSON 是唯一可靠选择。它本质是把 JSON 变成一张临时表。

jm-jsjkxyjs02-pzl-803
jm-jsjkxyjs02-pzl-803

查询全球任意城市的实时天气和未来天气预报

下载
  • 必须配合 WITH 子句定义列名和类型,否则返回的是键/值对的通用结构,没法直接过滤
  • 路径表达式在 WITH 里写,比如 name NVARCHAR(50) '$.name',不加 $ 前缀也能工作,但显式写更清晰
  • 如果原始 JSON 是数组(如 [{"a":1},{"a":2}]),OPENJSON 默认按元素展开;如果是单个对象({"a":1}),需加 AS JSON 或用 JSON_QUERY 包一层再进
  • 示例:SELECT f.id, j.name, j.grade FROM Families f CROSS APPLY OPENJSON(f.doc) WITH (name NVARCHAR(50), grade INT) AS j WHERE j.grade > 5

ISJSON + 索引让查询变快

直接在 JSON 字段上建索引是无效的。想加速 JSON_VALUE 查询,得用「计算列 + 持久化 + 索引」三步走。

  • 先加计算列:ALTER TABLE Families ADD name_computed AS JSON_VALUE(doc, '$.name') PERSISTED
  • 再建索引:CREATE INDEX IX_Families_name ON Families(name_computed)
  • 注意:计算列必须 PERSISTED 才能索引;且 ISJSON(doc) > 0 应该作为 CHECK 约束加上,避免无效 JSON 污染计算列结果
  • 兼容性级别必须 ≥ 130(SQL Server 2016 默认就是,但老数据库升级后可能没改)

别踩这些坑

常见报错或静默失败,基本都出在这几处:

  • 字段类型用了 textvarchar:JSON 函数只认 nvarchar(含 nvarchar(max)),text 已废弃且不支持
  • 路径写错但没报错:比如写成 '$..name'(双点是 XPath 风格,SQL Server 不支持),实际要用 '$.name';数组下标越界也只返回 NULL,容易误判为数据缺失
  • WHERE 中混用 JSON 和非 JSON 字段:比如 WHERE JSON_VALUE(doc, '$.id') = id,如果 docid 是字符串而表中 id 是 int,隐式转换会失败,最好显式转类型
  • 忘了 ISJSON 校验:如果业务允许往 JSON 字段插任意字符串,JSON_VALUE 在无效 JSON 上始终返回 NULL,WHERE 条件可能意外匹配所有坏数据

真正麻烦的不是语法,而是 JSON 字段里结构不一致——有人存 {"name":"a"},有人存 [{"name":"a"}],同一字段混合类型会让 OPENJSON 展开逻辑变得脆弱。上线前最好用 ISJSON 扫一遍数据分布。

相关文章

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

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

下载

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

相关专题

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

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

2023.08.07

1955

5

json是什么
json是什么

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

2023.08.23

2602

1

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

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

2023.10.13

896

3

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

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

2025.09.10

2899

7

sqlserver和mysql区别
sqlserver和mysql区别

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

2023.08.11

4351

4

NumPy性能优化版本更新与常见报错排查
NumPy性能优化版本更新与常见报错排查

本专题整理 NumPy 性能优化、版本更新与常见报错排查相关教程,覆盖向量化计算、广播性能、内存布局、NumPy 2.0 升级、版本兼容冲突、安装导入报错、dtype 溢出、矩阵运算异常和 broadcasting 报错修复,帮助读者系统掌握 NumPy 性能调优与问题定位方法。

2026.09.22

0

25

Vibeknow在线使用入口合集
Vibeknow在线使用入口合集

本专题汇总了Vibeknow在线创作视频的官方入口及网页版使用教程,涵盖PPT、PDF、Word等文档一键转讲解视频的核心操作,并整理了免费版水印规则与手机端浏览器访问指南,助你快速将知识内容视频化。

2026.09.21

20

20

NumPy随机数文件读写与dtype数据类型
NumPy随机数文件读写与dtype数据类型

本专题整理 NumPy 随机数、文件读写与 dtype 数据类型相关教程,覆盖 Generator/random、随机数种子、正态分布采样、npy/npz/CSV/TXT 保存读取、loadtxt/savetxt、memmap、大文件处理、astype 类型转换、结构化 dtype、整数溢出和精度丢失等场景。

2026.09.21

20

24

NumPy矩阵运算与线性代数计算
NumPy矩阵运算与线性代数计算

本专题整理 NumPy 矩阵运算与线性代数计算相关教程,覆盖矩阵乘法、dot 与 @ 运算符、逆矩阵、行列式、特征值与特征向量、SVD、线性方程组、欧氏距离、矩阵分解和大规模矩阵性能优化等内容,帮助读者掌握 np.linalg 与矩阵计算实战。

2026.09.21

0

20

热门下载

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

精品课程

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

共101课时 | 20.5万人学习

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

共39课时 | 4.7万人学习