在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='
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 文档来释放内存。