很多人对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 

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


<ClassInfo CID="1" Cnumber="100" CName="博客园一班">
  <dbo.Students SID="1" SName="苏飞" />
  <dbo.Students SID="2" SName="金色海洋" />
</ClassInfo>
<ClassInfo CID="2" Cnumber="10" CName="博客园二班">
  <dbo.Students SID="3" SName="赵劼" />
  <dbo.Students SID="4" SName="DUDU" />
</ClassInfo>
<ClassInfo CID="3" Cnumber="5" CName="博客园二班">
  <dbo.Students SID="5" SName="李永京" />
</ClassInfo>

我们可以看到这里没有根结点,当然我们要吧通过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')

返回结果


<studentInfo>
  <ClassInfo CID="1" Cnumber="100" CName="博客园一班">
    <dbo.Students SID="1" SName="苏飞" />
    <dbo.Students SID="2" SName="金色海洋" />
  </ClassInfo>
  <ClassInfo CID="2" Cnumber="10" CName="博客园二班">
    <dbo.Students SID="3" SName="赵劼" />
    <dbo.Students SID="4" SName="DUDU" />
  </ClassInfo>
  <ClassInfo CID="3" Cnumber="5" CName="博客园二班">
    <dbo.Students SID="5" SName="李永京" />
  </ClassInfo>
</studentInfo>

我们发现和我们平时常的Xml文档的格式还是不一样,我们再加上一个Elements属性试试


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'),Elements

返回的结果如下


<studentInfo>
  <ClassInfo>
    <CID></CID>
    <Cnumber></Cnumber>
    <CName>博客园一班</CName>
    <dbo.Students>
      <SID></SID>
      <SName>苏飞</SName>
    </dbo.Students>
    <dbo.Students>
      <SID></SID>
      <SName>金色海洋</SName>
    </dbo.Students>
  </ClassInfo>
  <ClassInfo>
    <CID></CID>
    <Cnumber></Cnumber>
    <CName>博客园二班</CName>
    <dbo.Students>
      <SID></SID>
      <SName>赵劼</SName>
    </dbo.Students>
    <dbo.Students>
      <SID></SID>
      <SName>DUDU</SName>
    </dbo.Students>
  </ClassInfo>
  <ClassInfo>
    <CID></CID>
    <Cnumber></Cnumber>
    <CName>博客园二班</CName>
    <dbo.Students>
      <SID></SID>
      <SName>李永京</SName>
    </dbo.Students>
  </ClassInfo>
</studentInfo>

基本是我们想要的数据了吧,我们还可以使用这样两个语句来完成,我们前面提到过Path 和Raw,其它在这里只要换成其中的一个就行结果是一样的
我们可看一下修改后的代码


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 ,root('studentInfo'),Elements

看结果吧


<studentInfo>
  <row>
    <CID></CID>
    <Cnumber></Cnumber>
    <CName>博客园一班</CName>
    <SID></SID>
    <SName>苏飞</SName>
  </row>
  <row>
    <CID></CID>
    <Cnumber></Cnumber>
    <CName>博客园一班</CName>
    <SID></SID>
    <SName>金色海洋</SName>
  </row>
  <row>
    <CID></CID>
    <Cnumber></Cnumber>
    <CName>博客园二班</CName>
    <SID></SID>
    <SName>赵劼</SName>
  </row>
  <row>
    <CID></CID>
    <Cnumber></Cnumber>
    <CName>博客园二班</CName>
    <SID></SID>
    <SName>DUDU</SName>
  </row>
  <row>
    <CID></CID>
    <Cnumber></Cnumber>
    <CName>博客园二班</CName>
    <SID></SID>
    <SName>李永京</SName>
  </row>
</studentInfo>

我相信这样的数据我们查询和处理起来就方便多了,
如果大家想要这样的数据其实要吧直接使用Path模式,这样会更方法
看代码


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 path ,root('studentInfo')

结果和上面的是完全一样的,也就是说这里不用再加上Elements属性也是一样的,也是我们最常用的一种方式
结果就不再贴了,相信简单的知道 这些以后已经能帮助不少对这块不怎么理解的朋友解决一部分问题了,因为基本的查询也就是这么多,我们在使用的时候只要返回结果集的第一行第一列就行了,然后怎么处理就是c#代码怎么处理Xml文档的问题了,

总结一下这几个东东吧,

Path 是以数据基本结构也就是以字段为结点的形式返回Xml文档(这样说不专业可能容易理解)

Raw 是把数据里所有的字段以属性的方式显示出Xml文档

Auto  自动关连到相应的项目,和Raw一样在不加Elements属性时以这种方式返回数据

建议大家做几个测试共没有几行代码,多动手才能真正体会它有做用

这些应该是入门级的,下节我希望能给大家介绍一下更深一点的东东,记得动手调试,,,,,,,,,,,,,,,,,,,,,,,,,,

本文来自于http://www.cnblogs.com/sufei/archive/2010/04/24/1719037.html

SQl 2005 For XMl 简单查询(Raw,Auto,Path模式)(1)的更多相关文章

  1. SQL中的SELECT_简单查询语句总结

    --以scott用户下的dept和emp表为例 --注意:如果scott用户不能使用,请使用system用户登录--解锁scott用户ALTER USER SCOTT ACCOUNT UNLOCK;- ...

  2. 【串线篇】SQL映射文件select简单查询标签

    一.参数(Parameters)传递 单个参数 基本类型:取值#{hahaha}随便写 多个参数 <!--   public Employee getEmpById(Integer id,Str ...

  3. SQL Server 输出 XML

    一.概述 SELECT 查询将结果作为行集返回.在 SQL 查询中指定 FOR XML 子句,从而将该查询的正式结果作为 XML 来检索.FOR XML 子句可以用在顶级查询和子查询中.顶级 FOR ...

  4. Sql Server 之 for xml (path,raw,auto,root)

    1.for xml path('str') select ID,CreateTime  from dbo.ArticleInfo for xml Path('mytitle') 结果:(注意:如果是s ...

  5. Querying Microsoft SQL Server 2012 读书笔记:查询和管理XML数据 1 -使用FOR XML返回XML结果集

    XML 介绍 <CustomersOrders> <Customer custid="1" companyname="Customer NRZBB&qu ...

  6. SQL SERVER中XML查询:FOR XML指定PATH

    SQL SERVER中XML查询:FOR XML指定PATH 前言 在SQL SERVER中,XML查询能够指定RAW,AUTO,EXPLICIT,PATH.本文用一些实例介绍SQL SERVER中指 ...

  7. Querying Microsoft SQL Server 2012 读书笔记:查询和管理XML数据 2 -使用XQuery 查询XML数据

    XQuery 是一个浏览/返回XML实例的标准语言. 它比老的只能简单处理节点的XPath表达式更丰富. 你可以同XPath一样使用.或是遍历所有节点,塑造XML实例的返回等. 作为一个查询语言, 你 ...

  8. SQL 2005 中查询或执行另外的数据库操作的方法

    原文:SQL 2005 中查询或执行另外的数据库操作的方法 摘要: 如果,你想在一台数据库服务器上,查询另一个台数据服务器的数据该如何做呢?如果,你想在同一台数据服务器上,在不同的数据库之间查询数据, ...

  9. LINQ to Sql系列二 简单查询和联接查询

    这一篇文章主要总结LINQ to sql的简单查询(单表查询)和联接查询(多表查询) 单表查询 需求是我们要输出TClass表中的结果.使用了from-in-select语句,代码如下: public ...

随机推荐

  1. php打印中文乱码

    php文档的文本格式都设置成 utf-8 格式 在代码中添加 header("content-type:text/html; charset=utf-8");

  2. 第3月30天 UIImage imageWithContentsOfFile卡顿 Can't add self as subview MPMoviePlayerControlle rcrash

    1. UIImage imageWithContentsOfFile卡顿 [[UIImage alloc] initWithContentsOfFile 卡顿 2.uitableview scroll ...

  3. 如何在centos下部署Node环境

    从今年开始,养车之家的PC 和 M端 的站点 ,服务器从tomcat全部改成了Node,无论在测试环境.准生产.正式环境,我们都需要在服务器进行Node的部署,在这里我给大家详细说明下Node在lin ...

  4. mac php环境启动

    mac 环境下,用brew安装php相关环境启动命令 说明 这里php,mysql,nginx都是用brew安装,安装目录默认,在Cellar下面 php-fpm 带配置重启 /*注意权限,加 sud ...

  5. 创伤后应激障碍(PTSD)

    创伤后应激障碍(Post Traumatic Stress Disorder,PTSD)又称延迟性心因性反应(Delayed Psychogenic Reaction),是由应激性事件或处境而引起的延 ...

  6. Laravel 安装代码智能提示扩展「laravel-ide-helper」

    ========================laravel-ide-helper======================== 使用 Laravel 框架IDE居然没有智能提示?这感觉实在太糟糕 ...

  7. CF576E

    *在#里发他一直WA这道CF题,然后我就去看了看,感觉还挺有趣的,那我就在这里整理一下我的思路..毕竟一边听歌.. 题意: 给个图,每条边初始无色,每次给一个询问(e,c)表示把e涂成颜色c,如果此时 ...

  8. 【Oracle】Oracle日期格式详解

    本文章没有经过验证,纯属使用CV大法.感谢原创的大牛. to_date("要转换的字符串","转换的格式")   两个参数的格式必须匹配,否则会报错. 即按照第 ...

  9. 远程ssh登陆时报错:/bin/bash: Permission denied

    远程普通用户ssh登录时,提示/bin/bash: Permission denied,用户名mas,密码正确. 首先上个图,用户远程登录步骤,转自http://www.tldp.org/LDP/LG ...

  10. Java中的堆栈区别

    在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配. 当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配 ...