SQL Server FOR XML PATH 语句的应用---列转行

经常在论坛看到高手使用了 for xml path,由于是搜索一下,记录了详细的使用方法。
在SQL Server中利用 FOR XML PATH 语句能够把查询的数据生成XML数据,下面是它的一些应用示例。

DECLARE @TempTable table(UserID int , UserName nvarchar(50));
insert into @TempTable (UserID,UserName) values (1,‘a‘)
insert into @TempTable (UserID,UserName) values (2,‘b‘)
 
select UserID,UserName from @TempTable FOR XML PATH运行这段脚本,将生成如下结果:<row>
  <UserID>1</UserID>
  <UserName>a</UserName>
</row>
<row>
  <UserID>2</UserID>
  <UserName>b</UserName>
</row>大家可以看到两行数据生成了两个节点,修改一下PATH的参数:select UserID,UserName from @TempTable FOR XML PATH(‘lzy‘)再次运行上述脚本,将生成如下的结果:

<lzy>
  <UserID>1</UserID>
  <UserName>a</UserName>
</lzy>
<lzy>
  <UserID>2</UserID>
  <UserName>b</UserName>
</lzy>可以看到节点变成,其实PATH() 括号内的参数是控制节点名称的,这样的话大家可以看一下如果是空字符串(不是没有参数)会是什么结果?select UserID,UserName from @TempTable FOR XML PATH(‘‘)执行上面这段脚本将生成结果:

<UserID>1</UserID>
<UserName>a</UserName>
<UserID>2</UserID>
<UserName>b</UserName>这样就不显示上级节点了,大家知道在 PATH 模式中,列名或列别名被作为 XPath 表达式来处理,也就是说,是列的名字,这样大胆试验一下不给指定列名和别名会是怎么样?

select CAST(UserID AS varchar) + ‘‘,UserName + ‘‘ from @TempTable FOR XML PATH(‘‘)

运行上面这句将生成结果

1a2b

所有数据都生成一行,而且还没有连接字符,这样的数据可能对大家没有用处,还可以再变化一下:
select CAST(UserID AS varchar) + ‘,‘,UserName + ‘‘,‘;‘ from @TempTable FOR XML PATH(‘‘)  
生成结果  
1,a;2,b;
大家现在明白了吧,可以通过控制参数来生成自己想要的结果,例如:  
select ‘{‘ + CAST(UserID AS varchar) + ‘,‘,‘"‘ +UserName + ‘"‘,‘}‘ from @TempTable FOR XML PATH(‘‘)  
生成结果  
{1,"a"}{2,"b"}
还可以生成其他格式,大家可以根据自己需要的格式进行组合。  
下面是一个数据统计的应用,希望大家可以通过下面的实例想到更多的应用  
DECLARE @T1 table(UserID int , UserName nvarchar(50),CityName nvarchar(50));
insert into @T1 (UserID,UserName,CityName) values (1,‘a‘,‘上海‘)
insert into @T1 (UserID,UserName,CityName) values (2,‘b‘,‘北京‘)
insert into @T1 (UserID,UserName,CityName) values (3,‘c‘,‘上海‘)
insert into @T1 (UserID,UserName,CityName) values (4,‘d‘,‘北京‘)
insert into @T1 (UserID,UserName,CityName) values (5,‘e‘,‘上海‘)
 
SELECT B.CityName,LEFT(UserList,LEN(UserList)-1) FROM (
SELECT CityName,
  (SELECT UserName+‘,‘ FROM @T1 WHERE CityName=A.CityName FOR XML PATH(‘‘)) AS UserList
FROM @T1 A  
GROUP BY CityName
) B

生成结果(每个城市的用户名)

北京 b,d
上海 a,c,e

转:Mr 斌 的专栏   SQL Server FOR XML PATH 语句的应用---列转行

时间: 2024-10-23 18:24:19

SQL Server FOR XML PATH 语句的应用---列转行的相关文章

SQL SERVER FOR XML PATH

转自:王波洋 (PS:对当前的博客进行了阅读,感觉不错,本来计划自己写一下,后来实在是时间不充裕并且博主写的不错,故转过来并稍微修正下) FOR XML PATH 有的人可能知道有的人可能不知道,其实它就是将查询结果集以XML形式展现,有了它我们可以简化我们的查询语句实现一些以前可能需要借助函数活存储过程来完成的工作. 一.FOR XML PATH 简单介绍           那么还是首先来介绍一下FOR XML PATH ,假设现在有一张兴趣爱好表(hobby)用来存放兴趣爱好,表结构如下:

灵活运用 SQL SERVER FOR XML PATH 转

灵活运用 SQL SERVER FOR XML PATH FOR XML PATH 有的人可能知道有的人可能不知道,其实它就是将查询结果集以XML形式展现,有了它我们可以简化我们的查询语句实现一些以前可能需要借助函数活存储过程来完成的工作.那么以一个实例为主. 一.FOR XML PATH 简单介绍              那么还是首先来介绍一下FOR XML PATH ,假设现在有一张兴趣爱好表(hobby)用来存放兴趣爱好,表结构如下: 接下来我们来看应用FOR XML PATH的查询结果

问题: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的查询结果

使用SQL SERVER FOR XML PATH将多个结果集转换成一行并进行去重处理

在一个医药行业的系统中需要根据患者的接触记录ID获取不同接触类型的集合,效果像这样 --患者接触记录信息,一个患者可以有N个不同的接触记录,每个接触记录又有N个接触类型记录 IF OBJECT_ID ('dbo.TEST') IS NOT NULL DROP TABLE dbo.TEST GO CREATE TABLE dbo.TEST ( ID INT IDENTITY (1000,1) NOT NULL, cid INT,--接触记录号 REMARK VARCHAR (4000), CONT

灵活运用 SQL SERVER FOR XML PATH

FOR XML PATH 有的人可能知道有的人可能不知道,其实它就是将查询结果集以XML形式展现,有了它我们可以简化我们的查询语句实现一些以前可能需要借助函数活存储过程来完成的工作.那么以一个实例为主. 一.FOR XML PATH 简单介绍              那么还是首先来介绍一下FOR XML PATH ,假设现在有一张兴趣爱好表(hobby)用来存放兴趣爱好,表结构如下: 接下来我们来看应用FOR XML PATH的查询结果语句如下: SELECT * FROM @hobby FO

Sql server—— for xml path简单用法(可以按照分组把相同组的列中的不同的值,像字符串一样拼接在一起显示在分组之后的列中。)

一个表,然后语句如下 --查询 select id, name=stuff((select ','+name from tb where id=t.id for xml path('')),1,1,'') from tb t group by id 结果如下: 分组的时候 注意看清 id=t.id  .错误的情况会把所有的列加起来.非常尴尬.

SQL SERVER FOR XML PATH合并字符串

两种方式,效率立竿见影 ------------------------------------------------ SET STATISTICS TIME ON DECLARE @OrderStr NVARCHAR(max) = ''; SELECT @OrderStr += a.SerialNumber+',' FROM dbo.WithdrawalsLog a SET STATISTICS TIME OFF ---------------------------------------

Sql server For XML Path 学习

最近看到太多人问这种问题   自己也不太了解  就在网上学习学习 自己测试一番 CREATE TABLE test0621 (id INT,NAME NVARCHAR(max)) INSERT test0621 VALUES(1,'aa'),(1,'bb'),(1,'cc')INSERT test0621 VALUES(2,'星期一'),(2,'星期二'),(2,'星期三') DROP TABLE test0621 SELECT * FROM test0621 SELECT * FROM tes

SQL SERVER中XML查询:FOR XML指定PATH

SQL SERVER中XML查询:FOR XML指定PATH 前言 在SQL SERVER中,XML查询能够指定RAW,AUTO,EXPLICIT,PATH.本文用一些实例介绍SQL SERVER中指定PATH的XML查询. PATH參数 PATH('參数'),參数是用来重命名ROW的,ROW是默认生成的名称. select 'Hui' for xml path  结果:<row>Hui</row> select 'Hui' for xml path ('root') 结果:<