标签:xml 书法 张三 李四 names hobby path mssql
准备工作:
CREATE TABLE [dbo].[Students]( [id] [int] IDENTITY(1,1) NOT NULL, [names] [varchar](50) NULL, [hobby] [varchar](50) NULL )
insert into students values('张三','书法'),('张三','篮球'),('张三','台球'),('李四','书法'),('李四','唱歌'),('李四','足球'),('李四','乒乓球')
|
for xml path
把查询结果用xml表现出来。
1 正常的查询:
select * from Students
结果是:
id names hobby
----------- --------------------------------------------------
1 张三 书法
2 张三 篮球
3 张三 台球
4 李四 书法
5 李四 唱歌
6 李四 足球
7 李四 乒乓球
返回的是一个数据表格(多条)。
2 用xml表现
select * from Students for xml path
结果是:
XML_F52E2B61-18A1-11d1-B105-00805F49916B
------------------------------------------------------------------------------------
<row><id>1</id><names>张三</names><hobby>书法</hobby></row><row><id>2</id><names>张三</names><hobby>篮球</hobby></row
><row><id>3</id><names>张三</names><hobby>台球</hobby></row><row><id>4</id><names>李四</names><hobby>书法</hobby></row>
<row><id>5</id><names>李四</names><hob
也是一个数据表格(单条)
把查询结果做为xml数据格式返回了一行数据。
3 通过使用path()参数,可改变列节点:
select * from Students for xml path('')
结果:
XML_F52E2B61-18A1-11d1-B105-00805F49916B
-----------------------------------------------------------------------------------
<id>1</id><names>张三</names><hobby>书法</hobby><id>2</id><names>张三</names><hobby>篮球</hobby>
<id>3</id><names>张三</names><hobby>台球</hobby><id>4</id><names>李四</names><hobby>书法</hobby>
<id>5</id><names>李四</names><hobby>唱歌</hobby><id>6</id><names>李四</names><hobby>足球
使用path(‘’)空参数,去掉了row节点,直接显示的是两个属性字段。
4 自定义节点
select * from Students for xml path('selfNode')
结果如下:
XML_F52E2B61-18A1-11d1-B105-00805F49916B
--------------------------------------------------------------------------------------------
<selfNode><id>1</id><names>张三</names><hobby>书法</hobby></selfNode>
<selfNode><id>2</id><names>张三</names><hobby>篮球</hobby></selfNode>
<selfNode><id>3</id><names>张三</names><hobby>台球</hobby></selfNode>
<selfNode><id>4</id><names>李四</names><hobby>书法</hobby></selfNode>
总的来说,for xml path返回的是一条数据(一个xml字串)。所以,这个可以作为查询中的一列。如下:
select distinct aaa.names,hobby=(
SELECT hobby+',' FROM students
WHERE names=aaa.names
FOR XML PATH('')
)
from students aaa
结果如下:
names hobby
--------------------------------------------------
李四 书法,唱歌,足球,乒乓球,
张三 书法,篮球,台球,
从students表中查询names,且各自的hobby,hobby是多条记录,通过xml 整合到一条记录,并使用逗点分隔。
上面的语句中有一句:where names=aaa.names,因为for xml path返回的是一条数据字串,不能进行查询条件的关联,即不能做为数据表与其它表进行关联。
它只返回一行一列,且for xml path都整合到一字符串中而没有其它字段,所以不能与其它表进行联合查询。但可以在for xml之前进行联合查询,如下:
select distinct aaa.names,hobby=(
select hobby+',' FROM students
where names=aaa.names
for xml path('')
) from students aaa
for xml path部分的结果做为一个字段显示,而粗体部分表示把每个names中的hobby字段通过逗号连成一个字段,如下:
names hobby
--------------------------------------------------
李四 书法,唱歌,足球,乒乓球,
张三 书法,篮球,台球,
未使用distinct,结果如下:
names hobby
--------------------------------------------------
张三 书法,篮球,台球,
张三 书法,篮球,台球,
张三 书法,篮球,台球,
李四 书法,唱歌,足球,乒乓球,
李四 书法,唱歌,足球,乒乓球,
李四 书法,唱歌,足球,乒乓球,
李四 书法,唱歌,足球,乒乓球,
把重复的去掉,可通过group或distinct去掉
另外:对于可容忍的脏读而不死锁的with onlock在mssql中可在表后边使用with(nolock)脏读;今天查了一下,对于mysql来说,不需要使用with nolock,会自动使用nolock. 。这个我自己未做过测试,大概只是了解一下。
标签:xml,书法,张三,李四,names,hobby,path,mssql 来源: https://www.cnblogs.com/jams742003/p/10338065.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。