很多人对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. Timequest收集命令

    表 1. 收集命令 命令 说明 all_clocks 返回设计中所有时钟的收集. all_inputs 返回设计中输入端口的收集. all_outputs 返回设计中所有寄存器的收集. get_cel ...

  2. iptables原理

    1.iptables防火墙简介 Iptables也叫netfilter是Linux下自带的一款免费且优秀的基于包过滤的防火墙工具,它的功能十分强大,使用非常灵活,可以对流入.流出.流经服务器的数据包进 ...

  3. Centos7下面配置静态IP

    修改网卡配置文件(操作前先备份一下该文件),/etc/sysconfig/network-scripts/ifcfg-enp0s3 ,如下: TYPE=Ethernet BOOTPROTO=stati ...

  4. 【转】Linux下Fork与Exec使用

    Linux下Fork与Exec使用 转自 Linux下Fork与Exec使用 一.引言 对于没有接触过Unix/Linux操作系统的人来说,fork是最难理解的概念之一:它执行一次却返回两个值.for ...

  5. [SHOI2008]堵塞的交通traffic

    我是萌萌的传送门 这题说白了就是一个支持加边和删边的图连通性维护,不过鉴于图的特殊性,可以直接线段树(听说标算就是这个--). 然而我人比较懒,不想思考怎么线段树,于是乎写了一发分治并查集,1A我真是 ...

  6. bootstrap的table调用本列ID

    我们是用json解析数据. 后台传送data数据~ String data = JSON.toJSONString(baseInfoService.list());request.setAttribu ...

  7. remove mysql

    apt-get --purge remove mysql-server mysql-client mysql-common apt-get autoremove rm -rf /etc/mysql r ...

  8. pureftp 服务

    没啥图,不喜勿喷---_-   ftp(file transfer protocol)--文件传输协议 (a)官网:www.pureftpd.org (b)原理 让用户连接上一个远程计算机(运行FTP ...

  9. 总结:在MyEclipse中部署一个wap应用时需要配置的环境变量,我的JDK是安装在C盘,mysql安装在D盘,Tomcat解压在E盘,所以路径一定要看清楚哦,!

  10. 20. Valid Parentheses

    1.题目: Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine if th ...