问题:sqlserver有没有类似Oracle的LISTAGG;结果: 灵活运用 SQL SERVER FOR XML PATH

灵活运用 SQL SERVER FOR XML PATH

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  就是来去掉逗号,并赋予有意义的列明!

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

时间: 2024-10-13 16:17:58

问题:sqlserver有没有类似Oracle的LISTAGG;结果: 灵活运用 SQL SERVER FOR XML PATH的相关文章

配置Oracle Gateway 12连接到SQL server 2014

最近的工作中需要基于Oracle连接到SQLserver2014,我们可以通过配置Gateway的方式来实现这个功能.这个Gateway的实质是透过dblink来实现的.即把SQLserver模拟成一个远端的Oracle实例,这个实例由Gateway来负责进行接收,转发等等.本文简要描述其配置过程. 一.安装环境介绍 gateway: 12.1.0.2 Oracle db: 11.2.0.4 + RHEL6.3 Sqlserver: 2014 + Win2012 如果安装在已经安装Oracle相

Oracle Transparent Gateway Connect to SQL Server 透明网关

Oracle Transparent Gateway Connect to SQL Server 使用Oracle提供的透明网关建立异构数据库连接关系.实现数据传输. 支持Distribution Transaction, 效能极好,使用时与普通SQL用法基本一致,异构数据库之间的联系非常透明,且在使用SQL Server提供的数据时同样可以应用到Oracle Procedure等特有资源,因此仅需一次性的配置,基本不需要在使用中再进行任何培训. 适合同时使用以Oracle为主的多种数据库且有数

无法创建链接服务器 &quot;xxx&quot; 的 OLE DB 访问接口 &quot;OraOLEDB.Oracle&quot; 的实例。 (Microsoft SQL Server,错误: 7302)

出现这个错误,有两个最常见的两个原因 1.注册表 <1>按下WIN+R,打开“运行”窗口,输入“regedit”,回车 <2>在打开的注册表编辑器的左侧按如下路径依次展开: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL.1\Providers 在Providers下面一般来说是看不到OraOLEDB.Oracle这一项的,于是新建这一项. 在Providers上面右键选择New -> Key,

Oracle GoldenGate 12c实时捕获SQL Server数据

在Oracle GoldenGate 12c中,对一些最新的数据库提供了支持,比如SQL Server 2012/2014,当然12c也支持sql server 2008.主要新增特性有: 捕获进程可以读取sql server压缩的本地备份日志: 当第三方日志备份工具限制读取交易日志时,OGG的捕获进程仍然能实现数据复制: OGG支持无主键表的数据捕获(在ogg 11g中对无主键的表,如要复制,会有一些要求): OGG可在sql server和其它异构数据库之间实时同步数据: OGG 捕获进程可

Oracle DBLink跨数据库访问SQL server数据同步 踩坑实录

项目需求:这里暂且叫A公司吧,A公司有一套人事管理软件,需要与我们公司的软件做人员信息同步,A公司用的是SQL server数据库,我们公司用的Oracle,接口都不会开发(一万句"fuck you"),就单单给我们公司提供了一个SQL server的账户和密码,还有一个视图.后来百度一番,可以通过DBLink跨数据库访问,然后做数据信息同步功能. 安装过程中,踩了不少的坑,需要配置很多的东西,QQ群里也请教不少人,都很少人听说还有这玩意,现在做数据对接,都是走到接口,传JSON字符串

SQL Server和Oracle数据库索引介绍

SQL Server和Oracle数据库索引介绍 1 SQL Server中的索引 索引是与表或视图关联的磁盘上结构,可以加快从表或视图中检索行的速度.索引包含由表或视图中的一列或多列生成的键.这些键存储在一个结构(B 树)中,使 SQL Server 可以快速有效地查找与键值关联的行. 表或视图可以包含以下类型的索引: 聚集索引 聚集索引根据数据行的键值在表或视图中排序和存储这些数据行.索引定义中包含聚集索引列.每个表只能有一个聚集索引,因为数据行本身只能按一个顺序排序. 只有当表包含聚集索引

Oracle GoldenGate for Sql Server连接ODBC失败的处理方法

Oracle GoldenGate for Sql Server连接oracle数据库的时候还是比较容易的,命令行下面只要: GGSCI> dblogin useridalias [ alias name]或者GGSCI> dblogin userid [ user name ] password [ password ] 就好了 如果是在MS SQL Server下面,也可以采用以下命令通过odbc连接: GGSCI> dblgoin sourcedb [ dsn ] 这里SQL SE

Oracle vs SQL Server

随着学习知识的不断变化,为了使用各种各样的学习的需求,接触的不同的数据处理的数据库也很多对于sql是充满了感情的,因为所做的.net系统都是借用sql来存储我们的数据,而对于oracle初次见面,多以来互相了解一下,其实所具有的东西都是大同小异的,只是显示的略有区别: <一>实用环境 一般情况下: 小型数据库 中型数据库 大型数据库 Access ,foxbase Mysql  sql server Sybase oracle db2 <二>主要区别 开放性 SQL Server是

SQL Server Migration Assistant for Oracle 示例-转载

SQL Server Migration Assistant for Oracle 示例 (2012-03-12 16:23:24) 转载▼ 标签: ssma oracle sql server it 分类: System 引言: 尝试将 Oracle 10gR2 数据迁移至 SQL Server 2005 (或更高版本). 需要准备的东西: 1). Oracle Enterprise Manager Console,即 Oracle 管理客户端: 2). SSMA for Oracle 5.2