编程语言研究书库

XML and JSON Recipes for SQL Server — 全书拆解

XML and JSON Recipes for SQL Server — 全书拆解

30 秒导读: 这是一本操作手册:SQL Server 里的 XML 和 JSON 怎么存、怎么生成、 怎么拆、怎么改、怎么加速,外加一整章「数据库自己的 XML/JSON」。 它的价值不在教概念(概念就地解释,不绕路),而在每个配方都按「你想干什么 → 怎么干 → 为什么这样」写,并附真实错误号和计时数字——比如「给 XML 列建索引(让按节点查值不必逐份拆文档)后 单个算子成本从 35782.9 降到 21.28」「JSON 索引不点路径会膨胀 1403 倍」。 读完这组文档,你不必看原书就能处理 SQL Server 里的 XML/JSON 日常问题, 也能读懂数据库写给自己的诊断报告。

1. 这是谁在什么时候写的

作者Alex Grinberg 与 Anna Landy——SQL Server 领域资深实践者;Grinberg 在书中多次以「我的客户」「我的日常分析」出场,是长期做生产支持的 DBA/顾问
版本第二版,2026 年(版权页 2026);第一版之后按读者反馈扩写,新增 SQL Server 2025 内容(原生 JSON 类型、JSON 索引、JSON_CONTAINS、聚合函数)
覆盖版本SQL Server 2016–2025;书中明说兼容级别要求:Part I(XML)样例用 AdventureWorks,Part II(JSON)样例用 WideWorldImporters
利益相关无;全书是 vendor-neutral 的微软技术实操,没有产品推销

2. 全书一条主线(读完这一节,你就懂了这本书)

这本书表面是 17 章 140+ 个并列配方,底下其实是一条数据形态的往复线: 关系表 ⇄ 半结构化文档,以及一条能力成熟度线:2000 年的补丁式支持 一路长成 2025 年的原生类型。把这两条线拧在一起,全书就一遍讲完。

第一步:先决定文档「住哪、怎么住」。 XML 有原生数据类型(2005 年起), 住进来自带「格式良好」门卫,还可以再挂一张 XML Schema 当校验卡(01 章); JSON 在 2025 年前只是 nvarchar 文本,没人替你校验,校验是自己的事(13 章)。 这个不对等的开场,决定了后面一切:XML 的错误大多「响」,JSON 的错误大多「默」。

第二步:两个方向的「翻译器」各有两代。 关系 → 文档:XML 走 FOR XML (02 章),JSON 走 FOR JSON(11 章),模式名都分 AUTO(自动起名)和 PATH(自己画结构)——PATH 都是受控一方的答案。文档 → 关系:XML 有 2000 年的 OPENXML(句柄+释放的仪式,会内存泄漏)和 2005 年接班的 XQuery(05/06 章);JSON 只有一个 OPENJSON(13 章),但 2025 年补上了 原生索引(14 章)。

第三步:改文档,两种哲学。 XML 给了一套迷你语言 XML DML,三条命令 (insert / replace value of / delete)外加位置、条件、通配等花样(07 章); JSON 只给一个 JSON_MODIFY 函数,增改删全塞在第三参数里,没有 rename、 没有位置控制(15 章)——书里最绕的配方(给 key 改名)正是这个不对等的代价。

第四步:快,是唯一硬通货。 过滤放进 XQuery 谓词比拆完用 WHERE 快一倍(08 章); XML 列没索引时,执行计划里「XML Reader」步骤吃掉 92% 成本,建主索引后同一个 算子从 35782.9 降到 21.28(09 章);JSON 老办法是计算列索引(8,843 次逻辑读 降到 3 次),2025 年的原生 JSON 索引不点路径会膨胀 1,403 倍、点了对齐路径就 显著缩小(14 章);XML 索引 2022 年起可以压缩,实测省六成(10 章)。

第五步(收官):数据库自己就是头号用户。 DDL 触发器的事件报告 (EVENTDATA)、扩展事件的输出、执行计划、SSIS 包,全是 XML;自动调优建议 藏在 DMV 的 JSON 列里(16–18 章)。学完整本书的回报在这里兑现:你读得懂 数据库写给自己的体检报告。 FLWOR(19 章)是最后的工具——XQuery 里的 循环与变换,把前面所有零件拧成编程环境。

3. 十九章地图

这张表不用记任何术语——每一行写的是「读完你能干什么」。

章读完你就能
01 认识 XML决定一份 XML 用元素还是属性存、要不要 Schema 校验、开不开压缩
02 生成 XML用 FOR XML 把查询结果变成 XML,知道四种模式选哪个、七个开关各治什么
03 写出 XML 文件把 XML 落盘:BCP 存储过程(15 毫秒)或 SSIS 包,以及 xp_cmdshell 的周旋
04 装入 XML 文件把一批 .xml 装进表:为什么必须用 SINGLE_BLOB、SSIS 六组件流水线、CLR 方案
05 拆分 XML(上)读懂老代码的 OPENXML,并把迁移到 XQuery 后会踩的三个坑填平
06 拆分 XML(下)对整列批量拆、拆 IMAGE 里的遗留 XML、拆类型化列、全库嗅探 XML 藏在哪
07 修改 XML用 modify() 三条命令改任何节点,避开单例、命名空间(给元素起独一无二名字域的机制)、属性语法三个雷
08 过滤 XML把 T-SQL 的 IN/BETWEEN/LIKE/NOT NULL 全部翻译成 XQuery,并知道为什么快一倍
09 XML 索引(上)看懂执行计划里的 XML Reader,给 XML 列建主索引和三种次要索引
10 XML 索引(下)用选择性索引按路径建小索引、加优化提示、压缩索引(省六成的那个开关)
11 生成 JSON(上)用 FOR JSON 产出 JSON,处理 NULL、外框数组、顶层 key、多行折数组
12 生成 JSON(下)用 2022/2025 四个函数拼 JSON 片段,处理转义和 CLR 类型的两个暗坑
13 JSON 转行集(上)用五个函数拆 JSON,记住 0-based、4000 上限、strict 模式三条军规
14 JSON 转行集(下)按路径/按值过滤 JSON,给 JSON 建索引(计算列老路 vs 2025 原生索引)
15 修改 JSON用 JSON_MODIFY 增改删,绕开 rename 缺失和 append 的大小写陷阱
16 内建 XML(上)用 DDL 触发器 + EVENTDATA 建审计流水线(实例级 + 库级两层)
17 内建 XML(中)建扩展事件会话、拆 .xel 报告、从死锁图反查计划、批量揪出 CONVERT_IMPLICIT
18 内建 XML/JSON(下)用 FOR XML RAW 发 HTML 邮件报表;读自动调优 DMV 的 JSON 建议
19 FLWOR在 XQuery 里写循环:遍历、过滤、排序、算指标、动态构造 XML

推荐顺序: 01 → 02 → 05 → 06 → 07 → 08 → 09 → 11 → 13 → 15 是主干; 03/04/10/12/14 按需查阅;16–19 是「进阶回报」,建议在主干之后读。 只想解决眼前问题的话,每章第 1 节「先看现象」+ 第 6 节「可带走的」就够。

4. 这本书覆盖什么、不覆盖什么

覆盖(读完你能回答):

  • XML/JSON 在 SQL Server 里的完整生命周期:存、生成、拆、改、过滤、索引、压缩;
  • 每一代的工具变迁(OPENXML→XQuery、nvarchar→JSON 类型、计算列→JSON 索引), 以及迁移时会踩的坑(命名空间静默失败、单例下标、0-based、大小写军规);
  • 数据库内部 XML/JSON 的四大应用:DDL 审计、扩展事件排障、HTML 邮件报表、 自动调优建议;
  • 大量可复验的证据:真实错误号(Msg 2226/9314/13608/13620/13625/13604/6506/ 6391)、计时对比(92% 成本、20ms vs 26ms、8,843→3 逻辑读、1403× 膨胀)。

不覆盖(别在这里找):

缺什么说明
XML/JSON 本身的标准与语义这本书假设你知道 XML 元素/属性、JSON 对象/数组是什么——它只教 SQL Server 怎么处理它们
理论化内容没有半结构化数据模型、查询代数、索引结构的原理性讨论;一切从「你想干什么」出发
非微软生态PostgreSQL/MySQL/MongoDB 的 JSON 能力只在对比表里露一面;SSIS/SSMS/Visual Studio 的操作细节会随版本过时
安全与治理的纵深xp_cmdshell 的审批、触发器的性能预算、邮件 Profile 配置,都点到为止(书里有立场,没有操作规程)
大数据量工程批量装载的并行、分区、断点续传不在讨论范围;性能数字全部来自样例库(万行级)

5. 我们的判断

判断(我们的,不是书里的): 这本书在书架上的定位是「SQL Server 半结构化数据的 现场手册」,不是教材。它的密度价值比很高:每个配方 3–10 页,问题、方案、原理、 边界齐全,错误号与计时数字可复验——比官方文档好读,比博客系统。引用它时引 机制和错误号,不要引界面操作(SSMS 菜单位置)和绝对性能数字。 如果错,会错在: 它是 2026 年的书,SQL Server 2025 的功能(JSON 类型、JSON 索引) 写出来时还很新——那两章的限制清单和体积数字,可能在后续累积更新里松动; 另外它的性能数字全部来自单机样例库,不能当容量规划的依据。

判断(我们的,不是书里的): 全书最该带走的不是任何一条语法,而是两个反向推理: ① 数据库把诊断信息写成 XML/JSON,会读的人拿到自动化能力(第 11 章存在的理由); ② 性能问题(隐式转换、无索引的拆分)在计划里「有字可查」——CONVERT_IMPLICIT 能 被一条 XPath 批量揪出来,是因为计划是 XML。结构化输出是一切自动化的前提, 这对任何系统都成立。 如果错,会错在: 对不以声明式计划暴露内部状态的系统(很多 NoSQL、应用层框架), 这套「拆内部 XML」的思路没有对应物——它是关系数据库工程文化的产物。

6. 今天读,要修正的三处

书里的说法该怎么修正依据
JSON 2025 原生索引的限制清单(14 章)当作「初版快照」读——书自己也说微软在持续投入;上线前核对该版本的最新文档原书 9-10 配方的限制清单与作者注释
性能数字(92%、1,403×、20ms vs 26ms)只作量级与方向的参照;容量决策在自己环境实测全部来自样例库(万行级),书内注明「你的机器数字会不同」
SSIS/SSMS 界面操作(03/04/11 章)学结构(任务流水线、变量传参),别背菜单位置界面随版本变,结构不变

拆解写于 2026-10-19,依据 2026 年第二版(Apress)。原始书籍文件不入库, 本组文档是我们自己的重写;每条引用都可用 node scripts/book-verify.mjs xml-json-recipes-sql-server 回核(792 处出处,全部可回核)。

On this page