T_SQL的 FOR XML PATH

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

一.FOR XML PATH 简单介绍

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

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

SELECT*FROM@hobbyFORXML 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@hobbyFORXML 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吗?对了就是用它!代码如下:

SELECThobbyID as'MyCode',hName as'MyName'FROM@hobbyFORXML 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@hobbyFORXML PATH('')

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

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

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

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

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

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

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

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

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

SELECTB.sName,LEFT(StuList,LEN(StuList)-1) ashobby FROM(
SELECTsName,
(SELECThobby+','FROMstudent 
  WHEREsName=A.sName 
  FORXML PATH('')) ASStuList
FROMstudent A 
GROUPBYsName
) B 

结果如下:

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

SELECThobby+','FROMstudent 
  WHEREsName=A.sName 
  FORXML PATH('')

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

那么接着看:

SELECTB.sName,LEFT(StuList,LEN(StuList)-1) ashobby FROM(
SELECTsName,
(SELECThobby+','FROMstudent 
  WHEREsName=A.sName 
  FORXML PATH('')) ASStuList
FROMstudent A 
GROUPBYsName
) B  

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

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

好啦,太晚啦就说到这里吧!

转载于:https://www.cnblogs.com/blues_/p/3479020.html

T_SQL的 FOR XML PATH 用法相关推荐

  1. SQL SERVER FOR XML PATH 用法

    有时候我们需要把多行数据,合并成一行显示,并用逗号或者其他方式分隔显示,这时候我们可以使用FOR XML PATH的方式,来实现需求.测试数据如下: --测试数据 if not object_id(N ...

  2. sql for xml path用法

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

  3. SQL之 Stuff和For xml path

    示例 昨天遇到一个SQL Server的问题:需要写一个储存过程来处理几个表中的数据,最后问题出在我想将一个表的一个列的多行内容拼接成一行,比如表中有两列数据 : 类别 名称 AAA 企业1 AAA ...

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

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

  5. sql server 利用 For Xml Path('') 多行数据拼接成一个字符串

    注意:这里有一种可能被弃用的方法,微软真他么坑死了,我的版本是19的,以前可以用,现在不行了 方法一(弃用): SELECT(SELECT CAST(bs_id AS VARCHAR(50)) + ' ...

  6. 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 ...

  7. sqlserver的for xml path和mysql的group_concat的区别

    前几天遇到公司更换数据库,将sqlserver更改为mysql,更改完后发现后台sql报错,是一个关于多行转换成一行的SQL问题,度娘告知for xml path只适用于sqlserver,并不适用于 ...

  8. SQL中的for xml path

    点击关注"SQL数据库开发", 设为"置顶或星标",第一时间送达干货 最近出的每日一题里面,有一道是关于合并同类型数据为一行的题,使用SQL Server 20 ...

  9. 灵活运用 SQL SERVER FOR XML PATH

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

最新文章

  1. Ansible03-管理变量、加密、事实
  2. Android视频压缩并且上传
  3. iOS9临时性解决HTTP以及scheme跳转问题
  4. 学习:erlang开源项目。
  5. CF1101D GCD Counting
  6. Java .Net Byte数组存储差异以及解决方法
  7. 字符设备驱动程序——点亮、熄灭LED操作
  8. 离开职场3年的宝妈,是该重回职场,还是自己创业呢?
  9. 为什么很多人不跑滴滴了?
  10. 面向对象程序设计的思想的长处
  11. IIC,SPI,I2S
  12. 给你 2021 最酷网页设计指南!
  13. 优缺点 快速扫描 硬盘监测_用硬盘检测工具检测硬盘超实用的技巧!
  14. 求一个数的最大真约数
  15. vue3.0项目打包后,由于vender.js 文件过大引起的首页加载时间缓慢的解决方式
  16. 使用JavaReport制作Web报表与图形 入门示例
  17. Android类似IOS的果冻效果
  18. 木子-前端-谷歌页面等调试时总是报No Found 404 错误(编码格式不识别问题导致的)
  19. igxe本地机器人怎么用_IGXE自售机器人第四批申请开启
  20. Spider第1课:爬虫基础

热门文章

  1. Python笔记-Flask结合SQLAlchemy查询MySQL数据库
  2. Java动态加载类(对反射的基本理解)
  3. Java基础入门笔记-数组对象
  4. android用户登录volley,如何在Android上使用Volley进行基本身份验证?
  5. client中周期性边界_FLUENT创建周期性边界条件方法
  6. thinkphp mysql 中文 问号_thinkphp分页中文参数乱码解决
  7. war 发布后页面不更新_吐槽 | 都发布一万年了,这游戏还不“更新”?
  8. python如何画虚线_Python威力巨大,五分钟如何绘制出漂亮的系统架构图?
  9. android shape画边框,安卓用shape画圆角矩形边框
  10. (王道408考研数据结构)第二章线性表-第三节1:单链表的定义及其操作(插入和删除,建立之尾插和头插)