FOR XML PATH 有的人可能知道有的人可能不知道,其实它就是将查询结果集以XML形式展现,有了它我们可以简化我们的查询语句实现一些以前可能需要借助函数活存储过程来完成的工作。那么以一个实例为主.

一.FOR XML PATH 简单介绍

             那么还是首先来介绍一下FOR XML PATH ,假设现在有一张兴趣爱好表(hobby)用来存放兴趣爱好,表结构如下:

接下来我们来看应用FOR XML PATH的查询结果语句如下:

SELECT * FROM @hobby FOR XML PATH

结果:

<row>
  <hobbyID>1</hobbyID>
  <hName>爬山</hName>
</row>
<row>
  <hobbyID>2</hobbyID>
  <hName>游泳</hName>
</row>
<row>
  <hobbyID>3</hobbyID>
  <hName>美食</hName>
</row>

由此可见FOR XML PATH 可以将查询结果根据行输出成XML各式!

那么,如何改变XML行节点的名称呢?代码如下:

SELECT * FROM @hobby FOR XML PATH('MyHobby')

结果一定也可想而知了吧?没错原来的行节点<row> 变成了我们在PATH后面括号()中,自定义的名称<MyHobby>,结果如下:

<MyHobby>
  <hobbyID>1</hobbyID>
  <hName>爬山</hName>
</MyHobby>
<MyHobby>
  <hobbyID>2</hobbyID>
  <hName>游泳</hName>
</MyHobby>
<MyHobby>
  <hobbyID>3</hobbyID>
  <hName>美食</hName>
</MyHobby>

这个时候细心的朋友一定又会问那么列节点如何改变呢?还记的给列起别名的关键字AS吗?对了就是用它!代码如下:

SELECT hobbyID as 'MyCode',hName as 'MyName' FROM @hobby FOR XML PATH('MyHobby')

那么这个时候我们列的节点名称也会编程我们自定义的名称 <MyCode>与<MyName>结果如下:

<MyHobby>
  <MyCode>1</MyCode>
  <MyName>爬山</MyName>
</MyHobby>
<MyHobby>
  <MyCode>2</MyCode>
  <MyName>游泳</MyName>
</MyHobby>
<MyHobby>
  <MyCode>3</MyCode>
  <MyName>美食</MyName>
</MyHobby>

噢! 既然行的节点与列的节点我们都可以自定义,我们是否可以构建我们喜欢的输出方式呢?还是看代码:

SELECT '[ '+hName+' ]' FROM @hobby FOR XML PATH('')

没错我们还可以通过符号+号,来对字符串类型字段的输出格式进行定义。结果如下:

[ 爬山 ][ 游泳 ][ 美食 ]

那么其他类型的列怎么自定义? 没关系,我们将它们转换成字符串类型就行啦!例如:

SELECT '{'+STR(hobbyID)+'}','[ '+hName+' ]' FROM @hobby FOR XML PATH('')

好的 FOR XML PATH就基本介绍到这里吧,更多关于FOR XML的知识请查阅帮助文档!

接下来我们来看一个FOR XML PATH的应用场景吧!那么开始吧。。。。。。

        二.一个应用场景与FOR XML PATH应用

        首先呢!我们在增加一张学生表,列分别为(stuID,sName,hobby),stuID代表学生编号,sName代表学生姓名,hobby列存学生的爱好!那么现在表结构如下:

这时,我们的要求是查询学生表,显示所有学生的爱好的结果集,代码如下:

SELECT B.sName,LEFT(StuList,LEN(StuList)-1) as hobby FROM (
SELECT sName,
(SELECT hobby+',' FROM student 
  WHERE sName=A.sName 
  FOR XML PATH('')) AS StuList
FROM student A 
GROUP BY sName
) B 

结果如下:

分析: 好的,那么我们来分析一下,首先看这句:

SELECT hobby+',' FROM student 
  WHERE sName=A.sName 
  FOR XML PATH('')

这句是通过FOR XML PATH 将某一姓名如张三的爱好,显示成格式为:“ 爱好1,爱好2,爱好3,”的格式!

那么接着看:

SELECT B.sName,LEFT(StuList,LEN(StuList)-1) as hobby FROM (
SELECT sName,
(SELECT hobby+',' FROM student 
  WHERE sName=A.sName 
  FOR XML PATH('')) AS StuList
FROM student A 
GROUP BY sName
) B  

剩下的代码首先是将表分组,在执行FOR XML PATH 格式化,这时当还没有执行最外层的SELECT时查询出的结构为:

可以看到StuList列里面的数据都会多出一个逗号,这时随外层的语句:SELECT B.sName,LEFT(StuList,LEN(StuList)-1) as hobby  就是来去掉逗号,并赋予有意义的列明!

转载于:https://www.cnblogs.com/littlewu/p/6117798.html

(Sql Server)SQL FOR XML PATH相关推荐

  1. 灵活运用 SQL Server 数据库的 FOR XML PATH

    起因¶ 今天欧阳冰提出一个报表需求,其核心部分可以简化为这样一张表格: 调度单号 与调度单相关的多张作业单号 001 0001/0002/0003 002 0004 003 0005/0006/000 ...

  2. sql limit 子句_SQL Server中的FOR XML PATH子句

    sql limit 子句 As SQL professionals, we often have to deal with XML data in our databases. This articl ...

  3. 使用SQL语句创建数据表(SQL Server)

    数据库 表的创建(SQL Server) 文章目录 数据库 表的创建(SQL Server) 使用SQL语句创建数据表 使用SQL语句创建数据表 CREATE TABLE的语法格式如下 databas ...

  4. 数据库原理与应用(SQL Server)笔记 第七章 流程控制语句、系统内置函数

    目录 一.流程控制语句 (一)BEGIN...END语句块 (二)条件语句 (三)循环语句 1.WHILE语句 2.BREAK语句和CONTINUE语句 (四)无条件转移语句 (五)返回语句 (六)等 ...

  5. 数据库原理与应用(SQL Server)笔记 第八章 用户自定义数据类型与变量

    前言 以下皆使用T-SQL语句的方式来执行语句,使用图形界面方式不再累赘. 一.用户定义数据类型 (一) CREATE TYPE 语句 1.CREATE TYPE语句 下面介绍使用T-SQL语句,创建 ...

  6. 数据库原理与应用(SQL Server)笔记 第二章 简单数据查询

    文章目录 前言 一.SELECT 子句 (一)投影指定的列和投影全部列 (二)AS子句修改查询结构的列标题 例题1 (三)TOP谓词限制结果集中的行数 (四)INTO子句将结果插入新表中 例题2 (五 ...

  7. 数据库原理与应用(SQL Server)笔记 第一章 数据定义语言和数据操纵语言

    文章目录 前言 一.基本介绍 二.在SQL里执行T-SQL语句 三.数据定义语言(DDL) (一)概述 (二)数据定义语言用于数据库 1.创建数据库 2.修改数据库 3.使用数据库 4.删除数据库 5 ...

  8. dmv io读写高的sql_适用于DBA的前8大新(或增强)SQL Server 2017 DMV和DMF

    dmv io读写高的sql Dynamic management views (DMVs) and dynamic management functions (DMFs) are system vie ...

  9. aws rds监控慢sql_探索AWS RDS SQL Server上SQL Server集成服务(SSIS)

    aws rds监控慢sql In the previous article, Deploy tabular databases in SSAS on AWS RDS SQL Server, we ex ...

最新文章

  1. 5.Queue和Deque的区别与联系
  2. Linux 驱动 Printk 在终端没有输出
  3. linux shell 和 golang 查询服务器硬件信息
  4. Java机器学习库ML之五样本不均衡
  5. (五)Java工具类ArrayUtils详解
  6. python 基础 -- python 模块
  7. leetcode851. 喧闹和富有(dfs)
  8. Windows+Android各类实用软件总结
  9. App IM 之 环信
  10. 容器操作系统再添丁,AWS开源Bottlerocket,类似RancherOS?
  11. jquery 取的单选按钮组的值
  12. 徐家骏:华为十年感悟
  13. 织梦网站源码,开源织梦网站源码,织梦dede网站源码
  14. Linux 内存管理 | 虚拟内存管理:虚拟内存空间、虚拟内存分配
  15. linux的xshell怎么保存密码,Xshell保存账号密码方法
  16. 使用RootTools实现对Android系统文件的读写
  17. Cosmos IBC
  18. 服务器安全篇之一【网络安全】
  19. 《当程序员的那些狗日日子》(五十九)凤凰涅磐
  20. 两套供左撇子人士使用的鼠标指针(带自动安装inf文件)

热门文章

  1. 在内存中读取函数的ShellCode并执行
  2. windows7不支持AllocateAndGetTcpExTableFromStack
  3. 关于使用spring管理hibernate,能够管理事务,却不执行除查询外的增删改操作,不能让数据库数据改变的原因
  4. pygame的一个小问题,未解决
  5. c++ 在multimap中查找关键字的程序举例
  6. python3创建一个游戏窗口
  7. linux查看进程和线程的命令
  8. TCP传输-出现差错的解决办法
  9. java中获取绝对值的方法_Java判断绝对值的方法总结
  10. 网站 admin.php,caozha-admin(PHP网站后台管理框架)v1.7.1官方安装版