SQL Server2005提供了一个新查询语法——For XML PATH(''),这个语法有什么用呢?想象一下这样一个查询需求:有两个表,班级表A、学生表B,要查询一个班级里有哪些学生?针对这个需求,方法有很多。举例一下两种:1、Join连接;2、For XML PATH('').
为了大家方便体验效果,附上创建数据库的代码:
--班级表 create table T_Class ( CNo int primary key not null identity,--班级编号 CName nvarchar(50) not null --班级名称 ) go --学生表 create table T_Student ( SNo int primary key not null identity,--学生编号 Name nvarchar(50) not null , --学生姓名 CNo int not null --所属班级 ) go
1.首先最容易想到的就是用Join连接
Join连接代码:
SELECTCName ,Name FROM T_Class c JOIN T_Student s ONs.CNo = c.CNo
Join效果图:
图1
已经基本满足了之前要的查询需求,但是感觉不够直观,这时候在想,能不能有这样的效果,就是每个班级为一行,一行中的一列列出所有学生。接下来是今天要讲得内容。
2.For XML PATH('')
先上代码:
SELECT CNo,
CName,
(SELECT Name+',' FROM dbo.T_Student s WHERE s.CNo=c.CNo For XML Path('')) AS Student --单独一列 ,所有学生在同一列中
FROM T_Class c
先上效果图,之后再详细讲:
图2
怎么样,是不是感觉更直观了呢?
解释说明:
Path('')中的参数如果为'空'(这里的空是指str.length=0),且所要的列(这里指Name)中如果没有额外添加字符(这里指Name后面的+’,‘ 请对照着上面的sql看),则生成Xml格式的字符串,如下图3:
图3
也就是说,如果没有给path参数赋除了空字符串以外的值,生成的xml会是以相应列名为节点的Xml节点(这里列名是Name,不是Student)。如果给一个非空的字符串,则会以此字符串为节点名称来生成Xml,如下图4:
图4
大家看到了,我在Name后面还加了个空字符串,如果不加这个空字符串会是什么效果呢?请看图5:
图5
所以,如果没有在所要的列中加入额外字符,所得的结果永远都会有<列名>值</列名>这样的Xml节点。也就是说如果要自己要的标签名,需要做两件事,1.在列名后面加任意字符;2.设置Path中的参数值为你想要的标签名。
总结:当要查询一个结果集,结果集里面首先是一个主表,结果集里面有一列是主表需要关联到外表的时候(也就是1对多的情况下),可以用这个语法。这句话不大会表达,大家慢慢琢磨,说的不好的,大家给意见,互相学习,多谢。