最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
当前位置: 首页 - 科技 - 知识百科 - 正文

SQLSERVER2005将查询结果转换为字串[接上一篇文章]

来源:懂视网 责编:小采 时间:2020-11-09 15:19:07
文档

SQLSERVER2005将查询结果转换为字串[接上一篇文章]

SQLSERVER2005将查询结果转换为字串[接上一篇文章]:--查询分组号为6的子孙子节点 with RTD1 as(select id ,pid from UserGroup),RTD2 as(select * from RTD1 where id=6union allselect RTD1.* from RTD2 inner join RTD1 on RTD2.id=RTD1.PID)select *
推荐度:
导读SQLSERVER2005将查询结果转换为字串[接上一篇文章]:--查询分组号为6的子孙子节点 with RTD1 as(select id ,pid from UserGroup),RTD2 as(select * from RTD1 where id=6union allselect RTD1.* from RTD2 inner join RTD1 on RTD2.id=RTD1.PID)select *

--查询分组号为6的子孙子节点 with RTD1 as(select id ,pid from UserGroup),RTD2 as(select * from RTD1 where id=6union allselect RTD1.* from RTD2 inner join RTD1 on RTD2.id=RTD1.PID)select * from RTD2 --现在想进一步将查询结果转换为逗号分隔的字

--查询分组号为6的子孙子节点

with 
	RTD1 as(
	select id ,pid from UserGroup
	),
	RTD2 as(
	select * from RTD1 where id=6
	union all
	select RTD1.* from RTD2 inner join RTD1 
	on RTD2.id=RTD1.PID
	)
select * from RTD2


--现在想进一步将查询结果转换为逗号分隔的字串

--查询分组号为6的子孙子节点

with 
	RTD1 as(
	select id ,pid from UserGroup
	),
	RTD2 as(
	select * from RTD1 where id=6
	union all
	select RTD1.* from RTD2 inner join RTD1 
	on RTD2.id=RTD1.PID
	)
--select * from RTD2
select ','+cast(id as nvarchar) from RTD2 for xml path('')


查询结果如下:

,6,17,18,20,21,22,23,24,29,25,26,28,27

(13 行受影响)

--现在想进一步去掉左边逗号,同时加上左右圆括号

--查询分组号为6的子孙子节点

with 
	RTD1 as(
	select id ,pid from UserGroup
	),
	RTD2 as(
	select * from RTD1 where id=6
	union all
	select RTD1.* from RTD2 inner join RTD1 
	on RTD2.id=RTD1.PID
	)
select '('+
	STUFF(
	(select ','+cast(id as nvarchar) from RTD2 for xml path('')),1,1,''
	)+
')'


查询结果如下:

(6,17,18,20,21,22,23,24,29,25,26,28,27)

(1 行受影响)

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

关于以上文章中关于for xml path的用法,我贴出一位朋友的博客如下[对这位朋友表示感谢]:

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

一.FOR XML PATH 简单介绍

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

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

SELECT * FROM @hobby FOR XML PATH

结果:


1
爬山


2
游泳


3
美食

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

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

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

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


1
爬山


2
游泳


3
美食

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

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

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


1
爬山


2
游泳


3
美食

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

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

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

关于stuff函数的用法:

删除指定长度的字符串并在指定的起始点插入另一组字符
STUFF ( character_expression , start , length , character_expression )
character_expression :操作的字符,
start:删除和插入的起始点,
length:删除的长度,
character_expression :要插入的字符

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文档

SQLSERVER2005将查询结果转换为字串[接上一篇文章]

SQLSERVER2005将查询结果转换为字串[接上一篇文章]:--查询分组号为6的子孙子节点 with RTD1 as(select id ,pid from UserGroup),RTD2 as(select * from RTD1 where id=6union allselect RTD1.* from RTD2 inner join RTD1 on RTD2.id=RTD1.PID)select *
推荐度:
标签: 转换 查询 文章
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top