SQl 2005 For XMl 简单查询(Raw,Auto,Path模式)(1)

发表于:2012-02-15来源:博客园作者:Perky Su点击数: 标签:sql
很多人对Xpath可能比较熟悉,但不知道有没有直接操作过数据库,我们都知道 在Sql2005里公支持的几种查询有Raw,Auto模式,页并没有Path和Elements用法等,如果在2000里使用过 Raw模式的朋友应该知道,是不容易处理查询结果的,那么在2005里对这一块做了很好的

  很多人对Xpath可能比较熟悉,但不知道有没有直接操作过数据库,我们都知道 在Sql2005里公支持的几种查询有Raw,Auto模式,页并没有Path和Elements用法等,如果在2000里使用过 Raw模式的朋友应该知道,是不容易处理查询结果的,那么在2005里对这一块做了很好的提升

  我先来介绍一下什么是Sql For Xml吧,我们大多时候都会有这种情况,想把表里的数据转化成Xml格式的,通常我们会使用c#或是Vb程序来转公,使用Xpath或是XmlDocument等对象来完成,当然这样是可以的,不过这样处理起来就会出现很多问题,比如说数据库变化,如果只有数据变化那方便,写一个通用的类,每次查询前更新Xml文件就可以了,但如果出现数据库结构的变化就会很吃力了,那么有没有一种方法,把数据在调出数据库之前就转化为Xml的呢,这个是当然的,就是我们的For Xml,大家在查询分析器里做表结果查询的时候一般是这样写的

  我们给大家展示一下我所用到的两个表吧

  第一个表班级信息表ClassInfo(班级信息表一共三个字段CID 本表ID,Cnumber 班级人数,CName 班级名称)

  第二个表 生信息表 Students (CID 班级表外键,SID学生信息表ID学生的学号就是,SName)

  SELECT CID,Cnumber,CName FROM ClassInfo WHERE CName='博客园一班'

  结果为:

  通常是这种方法,或是再加上个Order BY 什么的,或是像inner join 等查询的东东,其实我们只要在这条语句上少量的改动一下就可以得到我们想要的Xml数据了,也许 有朋友已经想到了是 For Xml 对就是这样的

  SELECT CID,Cnumber,CName FROM ClassInfo WHERE CName='博客园一班' FOR xml raw

  这样查询得到的结果如下:

  我们如果想看的更清楚的话只要单击一个就可以得到相应的Xml文件的形式了

  这里应该就是我们想要的Xml文件的形式了,其实就是这么简单的,我们可以通过Ado的方式 把他查询得到UI直接使用就OK了,

  我们可以看到我们得到的信息并不完整,没有学生信息,我们要吧使用一个连接的形式来完成看下面的Sql语句

  SELECT ClassInfo.CID,ClassInfo.Cnumber,ClassInfo.CName,Students.SID,Students.SName

  FROM ClassInfo JOIN dbo.Students ON Students.CID=dbo.ClassInfo.CID

  ORDER BY CID FOR xml raw

  复制代码

  这里我们是查询所有的学生和所在班级的信息

  结果为:

  raw 的形式是以属性的方法来显示字段的,我们还可以使用Auto,Auto是自动 ,它的意思 不用我多说看例子,(字体检查相关项目)

  我们把上面的代码修改一下

  SELECT ClassInfo.CID,ClassInfo.Cnumber,ClassInfo.CName,Students.SID,Students.SName

  FROM ClassInfo JOIN dbo.Students ON Students.CID=dbo.ClassInfo.CID

  ORDER BY CID FOR xml auto

  复制代码

  这样就能得到更为合理的数据,返回的结果如下

代码

  

  

  

  

  

  

  

  

  

  

  

  我们可以看到这里没有根结点,当然我们要吧通过Root属性来完成

  修改Sql语句

代码

  SELECT ClassInfo.CID,ClassInfo.Cnumber,ClassInfo.CName,Students.SID,Students.SName

  FROM ClassInfo JOIN dbo.Students ON Students.CID=dbo.ClassInfo.CID

  ORDER BY CID FOR xml auto ,root('studentInfo')

  返回结果

原文转自:http://www.ltesting.net