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/xiongnanbin/p/35bdbd15d83f39e3a9a3108842c1158f.html

【转载】SQL Server XML Path相关推荐

  1. 转载---SQL Server XML基础学习之5--XQuery(query)

    本章写一些SQL Server XML的一些XQuery基础语法,主要讲的query查询语法 T-SQL 支持用于查询 XML 数据类型的 XQuery 语言的子集. XQuery 基于现有的 XPa ...

  2. 转载---SQL Server XML基础学习2之--FOR XML AUTO/RAW

    本文主要介绍FOR XML 的 AUTO 模式和 RAW 模式 --AUTO 模式将查询结果以嵌套 XML 元素的方式返回.这不能较好地控制从查询结果生成的 XML 的形式. --如果要生成简单的层次 ...

  3. 转载---SQL Server XML基础学习之7--XML modify() 方法对 XML 数据中插入、更新或删除...

    /*------------------------------------------------------------------------------+ #| = : = : = : = : ...

  4. 将SQL for xml path('')中转义的字符正常显示

    将SQL for xml path('')中转义的字符正常显示 在工作中出现的发送邮件的时候:因为邮件内容中有链接,并且多个拼接在一起的,于是用了for xml path().        但是,这 ...

  5. (Sql Server)SQL FOR XML PATH

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

  6. SQL Server XML性能优化(Best Practices)

    1. XML数据模型 XML存储与处理查询的性能取决于数据库的设计与XML数据的结构与粒度.是否要使用XML数据模型,看你 是不是有半结构化的数据,需要保留文档结构与层次结构的标记语言数据,或可变的结 ...

  7. SQL Server XML格式化

    2019独角兽企业重金招聘Python工程师标准>>> 最近在项目中用到了SQL Server中的XML格式化,以下作了简单的总结. 以下使用PE_C_PersonnelArea这个 ...

  8. [转载]SQL Server 2005 Data Mining简介

    简介    企业均在尝试分析其数据时都面临若干问题.通常,并不缺乏数据.事实上,很多企业感觉到他们被数据淹没了:他们没有办法完全利用所有的数据,将其变成信息.为了处理这方面的问题,开发了数据仓库技术, ...

  9. SQL Server XML转Table

    前言 在SQL Server中有时候我们需要传人一个Table过去,然后可以在存储过程中批量更新,批量的获取相应数据. 但存储过程的参数是固定,所以这里我们可以变通的传人xml类型的参数,然后在存储过 ...

  10. SQL Server XML数据解析(1)

    很久就想写总结一下SQL Server解析XML数据的常用方法了,下面就给出一些示例,有事没事,你也可以参照着示例自己动手尝试着实现一下自己的需求. 示例1:从XML中解析数据到表变量 DECLARE ...

最新文章

  1. 程序员的8年床铺变化 | 每日趣闻
  2. 牛客网NOIP赛前集训营-提高组(第六场)B-选择题
  3. 一个c语言程序什么时候结束,新人求救,写了一个C语言程序,输入完数据后就结束了!!!...
  4. C#中使用Process调取Windows中的进程(应用程序)
  5. 编程方法学16:数组
  6. 前端学习(1981)vue之电商管理系统电商系统之完成可选项的添加操作
  7. 一训练就显存爆炸?Facebook 推出 8 比特优化器,两行代码拯救你的显存!
  8. 16名本科生领衔的芯片公司 芯微电子要上市了?
  9. Error opening data file Tesseract-OCR\tessdata/eng.traineddata问题解决
  10. IP数量就是计算机数量吗,如何利用bash/python计算IP子网容纳计算机数量
  11. Linux之/etc/group文件
  12. java中final用法
  13. mysql-日常命令使用汇总
  14. 基于堆叠卷积长短期神经网络【CNNLSTM】模型的时序数据预测分析
  15. 【js与jquery】产品详情页面常用的js特效
  16. Adobe Flash被禁用和无法加载的官方解决办法
  17. 解决can't find -lGL的问题
  18. Git 彻底删除大文件
  19. 使用函数创建多个备选BOM
  20. 企业运维岗位笔试真题

热门文章

  1. Spring Boot 2.x 集成 SLF4j + log4j2 日志框架
  2. 阶段3 1.Mybatis_09.Mybatis的多表操作_3 完成account的一对一操作-通过写account的子类方式查询...
  3. 阶段3 1.Mybatis_03.自定义Mybatis框架_3.自定义mybatis的编码-根据测试类中缺少的创建接口和类...
  4. 阶段1 语言基础+高级_1-3-Java语言高级_05-异常与多线程_第3节 线程同步机制_7_静态同步方法...
  5. git---怎样将分支上的一个单文件合并到主分支上(master)
  6. (递归)666:放苹果
  7. 微信运营:必须收藏的101条万能微信标题公式
  8. Beanutils基本用法
  9. 2013 蓝桥杯校内选拔赛 java本科B组(题目+答案)
  10. 查看Linux占用内存/CPU最多的进程