For XML PATH

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对多的情况下),可以用这个语法。这句话不大会表达,大家慢慢琢磨,说的不好的,大家给意见,互相学习,多谢。

原文地址:https://www.cnblogs.com/LJP-JumpAndFly/p/3954162.html