请大神解释一下stuff和for xml 实现xmlpath的开源库是什么意思

一.工作场景
背景:工作中经常会遇到一对多情况,将某列转成一对一可用到for xml path
create table #b (name nvarchar(10),title nvarchar(50))
insert into #b
values('周','1'),('周','2'),('周','3'),('吴','4'),('郑','5'),('郑','6'),('王','7')
select * from #b
将name-title 转成一对一:
select name,(
select title+';' from #b b where a.name = b.name for xml path('')
group by name
-----------------------------------
二.for xml path其他用法
1.拼接xml文件
select name as 'username',title as 'code' from #b for xml path('users')
若不重新命名字段或者行名称则默认拼接字段名或者row
2.自定义字符串输出格式
select '['+name+']' from #b group by name for xml path('')
总结:for xml path 作为字符串拼接可灵活运用。
欢迎指正,分享更多使用场景。
在SQL SERVER中,XML查询可以指定RAW,AUTO,EXPLICIT,PATH。本文用一些实例介绍SQL SERVER中指定PATH的XML查询。...
SQL中的FOR XML语法为表转化为XML提供了很好的支持,当然使用同样的程序语言也能够达到同样的效果,但是有了FOR XML将使得这一切更加的方便。
SELECT的查询结果会作为行集返回,但是你...
这两天在处理一个字符串拼接遇到一个问题:
FOR XML PATH 有的人可能知道有的人可能不知道,其实它就是将查询结果集以XML形式展现,有了它我们可以简化我们的查询语句实现一些以前可能需要借助函数活存储过程来完成的工作。那么以一个实例为主...
有时候我们可能有将查询的结果
CREATE TABLE #Temp(GroupName VARCHAR(100),FuncationName VARCHAR(100))
INSERT INTO #Temp VALUES('A...
经常在论坛看到高手使用了 for xml path,由于是搜索一下,记录了详细的使用方法。在SQL Server中利用 FOR XML PATH 语句能够把查询的数据生成XML数据,下面是它的一些应用...
有时候我们需要把多行数据,合并成一行显示,并用逗号或者其他方式分隔显示,这时候我们可以使用FOR XML PATH的方式,来实现需求。测试数据如下:--测试数据
if not object...
本篇主要讲怎么利用SQL的FOR XML PATH 参数来进行字符串拼接,FOR XML PATH的用法很简单,它会以xml文件的形式来返回数据。
  我的讲解步骤:
在Sql server2016版本之后的新特性中,利用For Json path 可以将表格内容转成Json字符串,有自动转化和指定格式等转换。详细可以访问微软官方文档。
在后台查询的语句需要拼接成...
没有更多推荐了,结果:&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 StuListFROM 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 StuListFROM student A GROUP BY sName) B
剩下的代码首先是将表分组,在执行FOR XML PATH 格式化,这时当还没有执行最外层的SELECT时查询出的结构为:可以看到StuList列里面的数据都会多出一个逗号,这时随外层的语句:SELECT B.sName,LEFT(StuList,LEN(StuList)-1) as hobby
就是来去掉逗号,并赋予有意义的列明!转自:
FOR XML PATH的使用方法
FOR XML PATH它就是将查询结果集以XML形式展现,有了它我们可以简化我们的查询语句实现一些以前可能需要借助函数活存储过程来完成的工作
select STUFF...
SqlServer的for xml
这两天在处理一个字符串拼接遇到一个问题:
for XML path 转义 使用心得
FOR XML PATH 是sqlserver数据库的语法,能将查询出的数据转换成xml格式的数据.
SQL for xml path 应用 很详细
SQL Server FOR XML PATH 语句的应用
经常在论坛看到高手使用了 for xml path,由于是搜索一下,记录了详细的使用方法。
在SQL Server中利用 FOR X...
SQL——用FOR XML Path完成字符串的聚合
CREATE TABLE #Temp(GroupName VARCHAR(100),FuncationName VARCHAR(100))
INSERT INTO #Temp VALUES('A...
SQL中FOR XML PATH 语句[可用于分组统计]
FOR XML PATH 语句 :(应该在sql2005及以上版本才能用)
declare @t table(id int,name varchar)
insert into @t(id,name...
FOR XML PATH多行合并到一行
FOR XML PATH 有的人可能知道有的人可能不知道,其实它就是将查询结果集以XML形式展现,有了它我们可以简化我们的查询语句实现一些以前可能需要借助函数活存储过程来完成的工作。那么以一个实例为主...
SQL中使用FOR XML PATH对字段进行拼接
SQL中的FOR XML语法为表转化为XML提供了很好的支持,当然使用同样的程序语言也能够达到同样的效果,但是有了FOR XML将使得这一切更加的方便。
SELECT的查询结果会作为行集返回,但是你...
sql for xml path用法 (转载)
一.FOR XML PATH 简单介绍
那么还是首先来介绍一下FOR XML PATH ,假设现在有一张兴趣爱好表(hobby)用来存放兴趣爱好,表结构如下:
没有更多推荐了,时间: July 11, 2018
(UV)访问: 178 次
在写SQL语句时,有时候需要对表中的行进行拼接,这时候可以使用STUFF()和for xml path()语句:如有表如下:id
----------
你想得到的结果如下:id
--------------
aaa,bbb,ccc
有的在业务系统中通过多次查询拼接也可以得到如上结果,但是多次查询数据库会更麻烦。这里可以使用TSQL的STUFF函数和for xml path()方法。查询语句如下:select id, result = stuff((select ','+name
from temp1 t1.id = t2.id
for xml path), 1, 1,'')
from temp1 t2
group by id
下面解释下上述语句如何执行的:1 通过for xml生成XML元素字符在查询语句后面添加for xml path能够将得到XML元素形式的结果,元素名称由path()参数指定,因此如果传入空字符串,执行如下语句:select ','+name from temp1 for xml path('')
会得到以下输出:,aaa,bbb,ccc
2 使用stuff函数移除前面的逗号stuff的函数声明如下:STUFF ( character_expression , start , length , replaceWith_expression )
从字面上看也比较简单,就是指定的字符串替换掉目标字符串:如以下:select result = stuff((select ','+name from temp1 for xml path('')), 1,1, '')
输出如下:aaa,bbb,ccc
3 Join操作要得到以ID为Key的目标结果,还需与之前的表进行join操作:select id, result = stuff((select ','+name
from temp1 t1.id = t2.id
for xml path), 1, 1,'')
from temp1 t2
group by id
注:之前有用到过这种写法,今天遇到又不记得具体用法了,故温习后写在这里当笔记。参考:
添加新评论
: 哈哈 就是懒,觉得我只是记录一些东西罢了,网站本身没啥重要的。
: 搜索typecho代码高亮进来了···一看和我的网站风格一模一样...  本篇主要讲怎么利用SQL的FOR XML PATH 参数来进行字符串拼接,FOR XML PATH的用法很简单,它会以xml文件的形式来返回数据。
  我的讲解步骤:
& & & & 1:构造初始数据
& & & & 2:提出问题
& & & & 3:简单介绍FOR XML PATH
& & & & 4:解答问题
&& 1.构造初始数据
& & 举出一个经典的学生课程例子,共有学生、课程与学生课程三张表。
  表1:Student
student_id
student_name
& & & 表2:Course
course_name
&&&&& 表3:Student_Course
student_id
&&& 脚本:create&table&&student(&&&&student_id&int&primary&key,&&&&student_name&nvarchar(50)&not&null)create&table&&course(&&&&course_id&int&primary&key,&&&&course_name&nvarchar(50)&not&null)create&table&&student_course(&&&&student_id&int&not&null,&&&&course_id&int&not&null,&&&&primary&key(student_id,course_id))&
&&&& 2.提出问题
&&&&&& 写一条SQL语句,查询显示出下列结果:
student_name
course_name
数学,英语
语言,英语
&&& 3.简单介绍 FOR XML PATH
&&&&& FOR XML PATH 语句能够把查询的数据生成XML数据,举个例子,针对student表,以前SQL语句的查询结果为:
select&str(student_id)&+&','&+&student_name&from&student&for&xml&path('student')
&&&& 查询结果:
&student&&&&&&&&&&1,张三&/student&
&student&&&&&&&&&&2,李四&/student&
&student&&&&&&&&&&3,王五&/student&
&&&&&& student已成为一个xml文件中的结点了,再看看FOR XML PATH('')的效果,针对上述SQL作出修改,
select&str(student_id)&+&','&+&student_name&from&student&for&xml&path('')
&&&&& 查询结果:
1,张三&2,李四&3,王五
&&&&&& 看得出来,这个参数自动把我们的查询结果串接在一起了,这下子,要做字符串拼接就很简单了!
&&& 4. 解答问题
&&&&&&&&&& 要查询想要的结果,我们首先用一般的SQL语句,连接三个表之后的结果为:
select&a.student_name,b.course_name&from&student_course&c,student&a,course&b&where&
&&&&&&&&&&&&c.student_id=a.student_id&and&c.course_id=b.course_id
&&&&&& 查询结果:
student_name
course_name
&&&&& 我们把这个查询结果看作为一个临时表,与自身进行一次连接,再得用FOR XML PATH('')参数来对课程course_name列进行拼接,再得用子查询功能。这样就得到一个每一个学生的所选的所有课程,由于上表会存在同一学生的多条记录,所以需要对最后的结果按学生进行分组,先看看查询语句:
select&student_name,
&&&(select&course_name+','&from&
&&&&&&&&select&student_name,course_name&from&
&&&&&&&&&(
&&&&&&&&&&&&select&a.student_name,b.course_name&from&stud_course&c,student&a,course&b&where&c.student_id=a.student_id&and&c.course_id=b.course_id
&&&&&&&&&)&as&a
&&&&&)&as&b&where&c.student_name=b.student_name&for&xml&path('')
&&&)&as&course_name
&&&&&&&&select&a.student_name,b.course_name&from&student_course&c,student&a,course&b&where&c.student_id=a.student_id&and&c.course_id=b.course_id
&&&&)&as&c& group by student_name
&&&& 查询结果:
student_name
course_name
数学,英语,
语言,英语,
& &&& && 还有个小问题, course_name后面多出一个,号,最后做一次裁剪,假设上面的SQL语句作为一个子查询 subquery&select&student_name,left(course_name,len(course_name)-1)&from&(........)&as&subquery&& 这样,就可以得出最终的结果!可以看得出来FOR XML PATH('') 参数非常强大!&& &PS:有很多人把这个叫行转列,我个人并不这么认为,虽然这和行转列有点像,但是这更像是字符串拼接!就把它这么叫好了!&PS:我的测试环境:SQL server 2008
阅读(...) 评论()急:mysql怎么实现sqlserver中for xml path_百度知道
急:mysql怎么实现sqlserver中for xml path
实际项目中需要,但是用的mysql,急用,,,或另外的思路,把多条记录的某个字段拼成一条记录的字段值...
实际项目中需要,但是用的mysql,急用,,,或另外的思路,把多条记录的某个字段拼成一条记录的字段值
答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
采纳数:31
获赞数:70
mysql中有group_concat()可以合并多行内容select AID,ANAME,(select group_concat(VALUE) from B where B.AID=A.AID) as AVALUE from A;
为你推荐:
其他类似问题
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。}

我要回帖

更多关于 forxmlpath 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信