讲师中心 微信公众号

工具推荐

视频效率加速
Seko
Seko

AI短剧一键生成成片

剧云
剧云

中文短剧剧本制作平台

updream

一键生成高质量推广成片

Laper
Laper

剧本策划到成片协作

如何在SQL Server中利用嵌套查询生成复杂的XML/JSON报告_使用FOR XML/JSON

夜敏小哥_7504

夜敏小哥_7504

发布时间:2026-05-06 16:23:18

|

285人浏览过

|

来源于php中文网

原创

SQL Server中嵌套数据首选FOR XML PATH+子查询,因其稳定可控;JSON需JSON_QUERY配合子查询生成,FOR JSON无法自动推导多层关系;XML须加TYPE防转义,JSON需INCLUDE_NULL_VALUES处理NULL。

如何在sql server中利用嵌套查询生成复杂的xml/json报告_使用for xml/json

SQL Server 2016+ 原生支持 JSON,但嵌套 XML 仍是更稳定、可控的层级输出方式;FOR XML PATH + 子查询是生成复杂嵌套结构最实用的组合,而 JSON 生成必须依赖 JSON_QUERY 和 JSON_VALUE 配合字符串拼接或子查询,不能靠单条 FOR JSON 自动推导多层关系。

用 FOR XML PATH('') + 相关子查询构造父子嵌套

这是生成订单含明细、部门含员工等一对多嵌套 XML 的主力方案。关键在于外层查父表,内层用相关子查询返回 XML 类型节点,并加 TYPE 防止被转义成字符串。

  • TYPE 必须加在子查询的 FOR XML 末尾,否则返回的是 NVARCHAR,会把尖括号自动转义为 和 <code>>
  • 子查询中字段别名决定 XML 元素名:例如 d.Quantity AS '@qty' 生成属性,d.ProductName AS 'product_name' 生成子元素
  • 若需文本节点(如 <name>John</name>),用 AS [text()],注意方括号和引号
  • 外层 FOR XML PATH('order') 控制每个父记录的包装标签,ROOT('orders') 补根节点——不加 ROOT 时结果是片段,没有顶层容器

示例:订单及其明细(含属性+子元素混合)

SELECT 
  o.OrderID AS '@id',
  o.OrderDate AS 'order_date',
  (SELECT 
     d.ProductID AS '@product_id',
     d.UnitPrice AS 'unit_price',
     d.Quantity AS 'quantity'
   FROM OrderDetails d 
   WHERE d.OrderID = o.OrderID 
   FOR XML PATH('detail'), TYPE) AS 'details'
FROM Orders o 
FOR XML PATH('order'), ROOT('orders');

FOR XML AUTO + ELEMENTS 适合快速扁平嵌套,但控制力弱

当只需简单“主表→从表”一层嵌套,且不介意元素名由表别名决定时,FOR XML AUTO, ELEMENTS 写法最短。但它不支持自定义层级深度、无法重命名元素、也不能混用属性与元素。

  • 必须显式列出字段,禁用 * ——否则同名列(如两个表都有 ID)会导致 XML 生成失败或字段丢失
  • 表别名即 XML 外层元素名:Orders o JOIN OrderDetails d → 生成 <o><d>...</d></o>
  • ELEMENTS 让所有字段变为子元素;不加则默认作为属性(仅限非空值),且无法控制哪些该是属性、哪些该是元素
  • 无法表达“一对多中的多”为同级多个节点(如多个 <detail></detail>),它会强制合并为一个 <d></d> 下的重复子元素,语义模糊

示例(仅适用于极简场景):

Expanso yaml-to-json
Expanso yaml-to-json

使用 Expanso Edge 管道将 YAML 输入转换为 JSON 格式。

下载
SELECT 
  o.OrderID,
  o.OrderDate,
  d.ProductID,
  d.Quantity
FROM Orders o 
JOIN OrderDetails d ON d.OrderID = o.OrderID
FOR XML AUTO, ELEMENTS, ROOT('result');

SQL Server 2016+ 中用 JSON 函数拼嵌套结构,不是靠 FOR JSON

FOR JSON 只能处理直接 JOIN 关系,无法生成“订单→客户信息→地址→城市”这种跨三张表的嵌套。真要嵌套 JSON,得用 JSON_QUERY 包裹子查询结果,并确保子查询本身返回合法 JSON 字符串。

  • 子查询必须用 FOR JSON PATH 生成字符串,再用 JSON_QUERY() 封装,否则会被当成普通字符串加引号(变成 "[{\"id\":1}]" 而非 [{"id":1}])
  • JSON_VALUE 只能取标量,JSON_QUERY 才能取对象或数组——嵌套结构必须用后者
  • 外层 SELECT 中不能对 JSON_QUERY 结果再做字符串拼接,否则破坏 JSON 结构;所有字段需统一走 FOR JSON PATH 或手动构造
  • NULL 值默认不输出字段,加 INCLUDE_NULL_VALUES 才生成 "field": null

示例:订单 + 内联客户信息(客户数据来自子查询)

SELECT 
  o.OrderID,
  o.OrderDate,
  JSON_QUERY((
    SELECT c.CustomerName, c.Email 
    FROM Customers c 
    WHERE c.CustomerID = o.CustomerID 
    FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
  )) AS customer
FROM Orders o
FOR JSON PATH, ROOT('orders');

容易忽略的字符与类型陷阱

XML 和 JSON 对特殊字符、NULL、编码的处理逻辑不同,同一份数据输出两种格式时行为不一致。

  • FOR XML 默认将 &、、<code>> 转义;FOR JSON 不转义,但要求输入字符串本身是合法 UTF-16(SQL Server 内部编码),含 BOM 或非法 surrogate pair 会报错
  • NULL 在 FOR XML 中默认不生成节点;加 XSI:NIL 或用 ISNULL(col, '') 控制;FOR JSON 默认跳过 NULL 字段,加 INCLUDE_NULL_VALUES 才保留
  • 日期时间字段:XML 输出为 2025-12-29T10:30:00 格式;JSON 输出为字符串 "2025-12-29T10:30:00",但若用 JSON_VALUE 提取,需额外转换类型
  • 大对象(如 NVARCHAR(MAX) 含长文本)在嵌套子查询中可能触发隐式截断——XML 模式下限制更松,JSON 模式下某些函数(如 JSON_MODIFY)对长度敏感

真正复杂的嵌套报告,别指望一条语句全自动搞定;先分层验证子查询是否返回预期结构,再逐层组装,比调试一整块嵌套更容易定位问题。

热门AI工具

更多
火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

DeepSeek

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

码上飞
码上飞 Hot

一款基于自然语言的AI应用开发平台,可根据用户描述自动生成应用程序,帮助个人和团队快速完成应用原型与开发。

花生AI
花生AI Hot

一款AI视频创作工具,主要用于B站推出的AI视频创作工具,适合需要提升相关任务效率的用户。

豆包大模型

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

WorkBuddy

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

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

相关专题

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

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

2295

2023.08.07

json是什么
json是什么

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

3762

2023.08.23

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

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

1256

2023.10.13

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

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

4359

2025.09.10

pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

5064

2024.04.01

xml怎么变成word
xml怎么变成word

步骤:1. 导入 xml 文件;2. 选择 xml 结构;3. 映射 xml 元素到 word 元素;4. 生成 word 文档。提示:确保 xml 文件结构良好,并预览 word 文档以验证转换是否成功。想了解更多xml的相关内容,可以阅读本专题下面的文章。

6597

2024.08.01

xml是什么格式的文件
xml是什么格式的文件

xml是一种纯文本格式的文件。xml指的是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。想了解更多相关的内容,可阅读本专题下面的相关文章。

2622

2024.11.28

sqlserver和mysql区别
sqlserver和mysql区别

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

6611

2023.08.11

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

60

2026.11.06

热门下载

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

精品课程

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

共101课时 | 21.3万人学习

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

共39课时 | 4.9万人学习

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

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