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

发表于:2012-02-15来源:博客园作者:Perky Su点击数: 标签:sql
在SQl 2005 For XMl 简单查询(Raw,Auto,Path模式)(1) 里我们说了关于Path,Raw和Auto模式的用法,其实里面不仅仅 是这些简单的操作,还有一些其它的特性,比如说Type或OpenXml方法,sp_xml_preparedocument存储过程 等这些增加的东东,我们来一个一个的看吧

  在SQl 2005 For XMl 简单查询(Raw,Auto,Path模式)(1) 里我们说了关于Path,Raw和Auto模式的用法,其实里面不仅仅 是这些简单的操作,还有一些其它的特性,比如说Type或OpenXml方法,sp_xml_preparedocument存储过程 等这些增加的东东,我们来一个一个的看吧,

  第一个Type关键字,Type大家都 知道 英文意思是类型,在这里也是和类型相关的,意思就是说让子集里面类型和集合的类型统一,具体 是怎么统一的这个我也不懂,大家还得自己去查或是找找MS的网站吧,我们还用上一节的数据库和表来实现具体表的结构还请大家参考SQl 2005 For XMl 简单查询(Raw,Auto,Path模式)(1)里面的 我们来做写一个这样的子查询

  SELECT SID,SName,(SELECT ClassInfo.CName from ClassInfo WHERE ClassInfo.CID=Students.CID FOR xml raw)

  FROM Students

  ORDER BY CID FOR xml auto

  复制代码

  我们可以清楚的看到子查询返回的是一个Xml类型的而外面的集合也是一个Xml类型的,这个时候如果我们直接执行的话就会发生错误

  消息 6809,级别 16,状态 1,第 1 行

  不能将未命名的表用作 XML 标识符,也不能将未命名的列用于属性名称。请在 SELECT 语句中使用 AS 对未命名的列/表进行命名。

  我们知道 如果是正常的情况下是可以的,无非就是这一列没有列名,但是是不会报错的,那这个时候我们就可以这样来写了

  SELECT SID,SName,(SELECT ClassInfo.CName from ClassInfo WHERE ClassInfo.CID=Students.CID FOR xml raw,type)

  FROM Students

  ORDER BY CID FOR xml auto

  复制代码

  只要在子集的后面加上一个Type就可以了,我们的Type就是在这种情况下使用的,也可能是我了解的太少了,我个人感觉 这个东东是没有什么太大的用处的,我们可以这样来写

  SELECT SID,SName,(SELECT ClassInfo.CName from ClassInfo WHERE ClassInfo.CID=Students.CID FOR xml path) AS '班级'

  FROM Students

  ORDER BY CID FOR xml auto

  复制代码

  只要我们给这一列起一个别名,无论你使用那种模式都 不用加什么Type了,所以最少在这个时候基本不用使用谁会让一列没有名称呢?

  大家把语句直接执行就Ok了,

  我们来看第二个OpenXml方法,他其实要和sp_xml_preparedocument存储过程合起来用比较好,我们来看个例子吧

代码

  declare @docxml xml;

  set @docxml='

  

  

  1

  苏飞

  <row><CName>博客园一班</CName></row>

  

  

  2

  金色海洋

  <row><CName>博客园一班</CName></row>

  

  

';

  DECLARE @handel int;

  EXEC sp_xml_preparedocument @handel output, @docxml

  SELECT * from OPENXML(@handel,'/st/row',2)

  WITH(SID int ,SName varchar(50),CName varchar(50))

  查询得到的结果

  一个一个的分析一下吧,sp_xml_preparedocument是把一个Xml文件转成XmlDocument文档形式

  而OpenXml是在XmlDocument中查询出相应的内容关转成Table形式输出也可以是视图,OPENXML 是一个行集提供程序,类似于表或视图,提供内存中 XML 文档上的行集。OPENXML 通过提供 XML 文档内部表示形式的行集视图,允许访问 XML 数据,就像它是关系行集一样。行集中的记录可以存储在数据库表中。OPENXML 可在用于指定源表或源视图的 SELECT 和 SELECT INTO 语句中使用。

  首先 sp_xml_preparedocument 存储过程分析 XML 文档。分析后的文档是 XML 文档中各节点(元素、属性、文本和注释)的树状表示形式。然后,OPENXML 引用此经过分析的 XML 文档,并提供此 XML 文档全部或部分内容的行集视图。使用 OPENXML 的 INSERT 语句可将数据从这样的行集插入数据库表中。可以使用多个 OPENXML 调用来提供 XML 文档中各部分的行集视图,并对它们进行处理,例如,将它们插入不同的表中。此过程也称为“将 XML 拆分到表中”。

  SQL Server 2005 联机丛书(2008 年 11 月)

  使用 OPENXML 查询 XML

  OPENXML 是一个 Transact-SQL 关键字,对内存中的 XML 文档提供与表或视图相似的行集。OPENXML 允许像访问关系行集一样访问 XML 数据。它通过提供以内部形式表示的 XML 文档的行集视图来实现这一点。行集中的记录可以存储在数据库表中。

  无论行集提供程序(视图或 OPENROWSET)可以在何处作为源出现,都可以在 SELECT 和 SELECT INTO 语句中使用 OPENXML。有关 OPENXML 语法的信息,请参见 OPENXML (Transact-SQL)。

  若要使用 OPENXML 编写对 XML 文档执行的查询,必须先调用 sp_xml_preparedocument。它将分析 XML 文档并向准备使用的已分析文档返回一个句柄。已分析文档以文档对象模型 (DOM) 树的形式说明 XML 文档中的各种节点。该文档句柄传递给 OPENXML。然后 OPENXML 根据传递给它的参数提供一个该文档的行集视图。

  必须通过调用 sp_xml_removedocument 系统存储过程从内存中删除以内部形式表示的 XML 文档来释放内存。

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