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

  • 相关阅读:
    2019.9.4 二维树状数组
    2019.9.4 简单题
    0052-YH的计算器
    0051-打乱顺序的三位数
    0050-计算天数
    0049-学校的上网费
    0048-三角形的判断
    0047-月份转换
    0046-简单的分段函数(二)
    0045-简单的分段函数(一)
  • 原文地址:https://www.cnblogs.com/LJP-JumpAndFly/p/3954162.html
Copyright © 2011-2022 走看看