在SQL Server 2022中如何用ISJSON校验输入数据

风磊君_6357

风磊君_6357

2026-10-05

453人浏览

原创

isjson在sql server 2022中仍为json语法校验首选,新增json_type_constraint参数支持value、array、object、scalar四类类型约束,需按语义精准选用,配合计算列与筛选索引方可保障性能。

在sql server 2022中如何用isjson校验输入数据

ISJSON 在 SQL Server 2022 中仍是校验 JSON 字符串语法合法性的首选函数,但它比旧版本多了类型约束能力——不光能判“是不是 JSON”,还能判“是不是你想要的那类 JSON”。

ISJSON(expression, json_type_constraint) 的 type 参数怎么选

SQL Server 2022 新增的 json_type_constraint 参数支持 VALUE、ARRAY、OBJECT、SCALAR 四种值,选错会导致误判:

  • OBJECT:只认 {...} 开头结尾的结构,{"a":1} 返回 1,[{"a":1}] 返回 0
  • ARRAY:只认 [...],[] 或 [1,"x",{}] 都行,但 {"items":[]} 返回 0
  • SCALAR:专用于校验 RFC 8259 兼容的“纯标量”顶层值,比如 "hello"、42、true、null;注意 'null'(字符串)返回 0,而 null(字面量)返回 1
  • VALUE:最宽泛,覆盖对象、数组、标量三类,等价于不传第二个参数时的行为

常见报错和静默失败场景

ISJSON 不抛异常,但输入类型或内容不对时会返回 0 或 NULL,容易被忽略:

  • 传入 TEXT 或 XML 类型字段会直接报错,必须先 CAST(col AS NVARCHAR(MAX))
  • 带 UTF-8 BOM 的字符串(如以 0xEFBBBF 开头)会被识别为非法字符,返回 0;建议入库前用 REPLACE(LEFT(@s,3), NCHAR(0xFEFF), N'') 清理
  • 空字符串 '' 返回 0,'null'(小写字符串)返回 1,NULL 输入返回 NULL —— CHECK 约束中要额外加 col IS NOT NULL 才能禁 NULL
  • 键名重复、数字溢出(如 999999999999999999999)、控制字符(U+0000)均不会触发错误,ISJSON 只做语法扫描

在存储过程里安全调用 ISJSON 的惯用写法

别等 JSON_VALUE 返回 NULL 才发现问题,校验必须前置:

Feishu calendar sync, local ics to json data for AI agent
Feishu calendar sync, local ics to json data for AI agent

将ICS日历文件转为JSON格式,用于飞书日历导入导出及数据集成。

下载
IF ISJSON(@input) = 0
BEGIN
    RAISERROR('Invalid JSON format in @input', 16, 1);
    RETURN;
END
<p>-- 若需强约束为对象,用:
IF ISJSON(@input, OBJECT) = 0
BEGIN
RAISERROR('Expected JSON object, got %s', 16, 1, @input);
RETURN;
END</p>

注意:不要写 ISJSON(@input) > 0,因为返回 NULL 时整个条件为 UNKNOWN,逻辑失效;必须显式写 = 1 或 = 0。

WHERE 条件中用 ISJSON 的性能陷阱

直接写 WHERE ISJSON(json_col) = 1 无法利用 json_col 上的普通索引,执行计划必是全表扫描:

  • 高频查询场景下,应建计算列:ALTER TABLE logs ADD json_valid AS ISJSON(payload);
  • 再建筛选索引:CREATE INDEX IX_logs_valid_json ON logs(json_valid) WHERE json_valid = 1;
  • WHERE 子句改用 WHERE json_valid = 1 AND ...,才能走索引

真正容易被忽略的是:即使你加了 CHECK 约束,SQL Server 也不会自动为 ISJSON() 表达式建统计信息,优化器对它的选择性预估极不准,所以计算列 + 筛选索引不是可选项,而是必要项。

相关文章

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

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

下载

相关标签:

js json

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

相关专题

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

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

2023.08.07

2015

5

json是什么
json是什么

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

2023.08.23

2902

1

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

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

2023.10.13

996

3

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

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

2025.09.10

3279

7

sqlserver和mysql区别
sqlserver和mysql区别

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

2023.08.11

4911

4

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

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

2026.09.30

80

10

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

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

2026.09.30

80

14

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

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

2026.09.30

40

12

PDF转图片方法
PDF转图片方法

需要把 PDF 页面用于上传、预览、分享或图片归档时,PDF 转图片方法专题整理 JPG/PNG 格式选择、逐页导出、清晰度设置、批量下载和结果检查等流程,帮助用户稳定完成 PDF 图片化处理。

2026.09.30

40

26

热门下载

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

精品课程

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

共101课时 | 20.8万人学习

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

共39课时 | 4.8万人学习