SQL Server 2000数据库FOR XML查询概述(2)

作者:肯尼思 时间:2008-12-09 14:49:00 

从上面的结构可以看出数据的xml结构不是很舒服,存在比较大的冗余。想象中改进后的结构如下:

3

Aniseed Syrup

4

Chef Anton's Cajun Seasoning

1

Chai

2

Chang

从上面看出Category元素的Tag为1,Parent为NULL,而Product元素的Tag为2,Parent为1(即Category的Tag值)。这里有一个问题需要解决,那就是在Tag和Parent中存在两套值,这里就需要使用UNION ALL运算符来实现这项功能,UNION ALL运算符的一项功能就是消除查询返回的重复的行。使用UNION ALL时需要注意的是结果集的列数必须相同。

查询语句:

SELECT 1 AS Tag,NULL AS Parent,

CategoryID AS [Category!1!ID],

CategoryName AS [Category!1!Name],

NULL AS [Product!2!ProductID!element],

NULL AS [Product!2!ProductName!element]

FROM Categories WHERE CategoryID < 3

UNION ALL

SELECT 2 AS Tag,1 AS Parent,

Categories.CategoryID AS [Category!1!ID],

Categories.CategoryName AS [Category!1!Name],--这里可以使用NULL代替

ProductID AS [Product!2!ProductID!element],

ProductName AS [Product!2!ProductName!element]

FROM Categories

JOIN Products ON Categories.CategoryID = Products.CategoryID AND ProductID <5

WHERE Categories.CategoryID < 3

ORDER BY [Category!1!ID] DESC,[Product!2!ProductID!element] ASC

FOR XML EXPLICIT

返回结果:

3

Aniseed Syrup

4

Chef Anton&apos;s Cajun Seasoning

1

Chai

2

Chang

不带FOR XML EXPLICIT语句的结果为:

Tag Parent Category!1! ID Category!1!Name Product!2! Product!2!

ProductID!element ProductName!element

---- ------- ---------- ------------ -------------------------- ----------------------------

1 NULL 2 Condiments NULL NULL

2 1 2 Condiments 3 Aniseed Syrup

2 1 2 Condiments 4 Chef Anton's Cajun Seasoning

1 NULL 1 Beverages NULL NULL

2 1 1 Beverages 1 Chai

2 1 1 Beverages 2 Chang

3.使用EXPLICIT模式查询中的指令

这些指令是指通用表列的第四部分,通过它对数据进行进一步控制。

1> 最常用的element和xml指令

通过该指令把列的数据显示为一个子元素而不是属性。

查询语句:

SELECT 1 AS Tag,NULL AS Parent,

CategoryID AS [Category!1!ID],

CategoryName [Category!1!Name],

Description [Category!1!!element]

FROM Categories

WHERE categoryID > 6 FOR XML EXPLICIT

返回结果:

Dried fruit and bean curd

Seaweed and fish

查询语句:

SELECT 1 AS Tag,NULL AS Parent,

CategoryID AS [Category!1!ID],

CategoryName [Category!1!Name],

Description [Category!1!Description!element]

FROM Categories

WHERE categoryID > 6 FOR XML EXPLICIT

返回结果:

Dried fruit and bean curd

Seaweed and fish

查询语句:

SELECT 1 AS Tag,NULL AS Parent,

CategoryID AS [Category!1!ID],

CategoryName [Category!1],

Description [Category!1!Description!element]

FROM Categories

WHERE categoryID > 6 FOR XML EXPLICIT

返回结果:

Produce

Dried fruit and bean curd

Seafood

Seaweed and fish

xml指令同element指令差不多,只是element指令会将一些xml下面的符号进行编码,如>被编码成>5,而xml指令不会。

2> 使用hide指令

该指令是用来处理那些不想返回结果的列,许多人会有疑问觉得没有必要,只要在列中不增加就行了,条件和排序也可以直接使用列。我们可以想得到使用UNION ALL时就用得上了,看下面的例子。

查询语句:

SELECT 1 AS Tag,NULL AS Parent,

CategoryID AS [Category!1!ID!hide],

CategoryName AS [Category!1!Name],

NULL AS [Product!2!ProductID!element],

NULL AS [Product!2!ProductName!element]

FROM Categories WHERE CategoryID < 3

UNION ALL

SELECT 2 ,1 ,

Categories.CategoryID,

NULL,

ProductID,

ProductName

FROM Categories

JOIN Products ON Categories.CategoryID = Products.CategoryID AND ProductID <5

WHERE Categories.CategoryID < 3

ORDER BY [Category!1!ID!hide] DESC,[Product!2!ProductID!element] ASC

FOR XML EXPLICIT

返回结果:

3

Aniseed Syrup

4

Chef Anton&apos;s Cajun Seasoning

1

Chai

2

Chang

3> 使用xmltext指令

该指令是用来处理包含xml片断内容的数据列,没找到现成的表结构和数据进行测试,所以就在Categories表中增加了XmlData列名,类型为nvarchar,默认值设置为&ldquo;&rdquo;。

查询语句:

SELECT 1 AS Tag,NULL AS Parent,

CategoryID AS [Category!1!ID],

XmlData AS [Category!1!CustomData!xmltext]

FROM Categories WHERE CategoryID = 8 FOR XML EXPLICIT

返回结果:

查询语句:

SELECT 1 AS Tag,NULL AS Parent,

CategoryID AS [Category!1!ID],

XmlData AS [Category!1!!xmltext]

FROM Categories WHERE categoryID = 8 FOR XML EXPLICIT

返回结果:


4> 使用cdata指令

使用该指令可以创建CDATA节防止一些字符数据被xml解析器。

查询语句:

SELECT 1 AS Tag,NULL AS Parent,

CategoryID AS [Category!1!ID],

XmlData AS [Category!1!!cdata]

FROM Categories WHERE categoryID = 6 FOR XML EXPLICIT

返回结果:

]]>

5> 使用ID、IDREF和IDREFS指令以及XMLDATA选项

由于这里只能返回XDR构架,不支持XSD架构的检索,我就只给出一个例子,

查询语句:

SELECT 1 AS Tag,NULL AS Parent,

CategoryID AS [Category!1!ID!ID],

CategoryName AS [Category!1!Name],

NULL AS [Product!2!ProductID!IDREF],

NULL AS [Product!2!ProductName]

FROM Categories WHERE CategoryID < 3

UNION ALL

SELECT 2 ,1 ,

Categories.CategoryID,

NULL,

ProductID,

ProductName

FROM Categories

JOIN Products ON Categories.CategoryID = Products.CategoryID AND ProductID <5

WHERE Categories.CategoryID < 3

ORDER BY [Category!1!ID!ID] ,[Product!2!ProductID!IDREF]

FOR XML EXPLICIT,XMLDATA

返回结果:

四.使用BINARY BASE64 选项

使用该选项可以检索二进制字段,比如图像数据以base64的形式返回到xml文档。

1.使用RAW方式

查询语句:

SELECT CategoryID,

Picture

FROM Categories

WHERE CategoryID =1

ORDER BY CategoryID DESC

FOR XML RAW,BINARY BASE64

返回结果:

2.使用AUTO方式

查询语句:

SELECT CategoryID,

Picture

FROM Categories

WHERE CategoryID =2

ORDER BY CategoryID DESC

FOR XML AUTO,BINARY BASE64

返回结果:


查询语句:

SELECT CategoryID,

Picture

FROM Categories

WHERE CategoryID =1

ORDER BY CategoryID DESC

FOR XML AUTO,ELEMENTS,BINARY BASE64

返回结果:

1

FRwvAAIAAAANAA4AFAAhAP////9CaXRt...

标签:
0
投稿

猜你喜欢

  • 用ASP对网页进行限制性的访问

    2008-07-03 13:02:00
  • window.location.hash属性介绍

    2008-03-21 12:39:00
  • CSS缩写可以有效的缩小CSS文件的体积

    2009-01-13 18:06:00
  • Quester解读17条广告效果测定

    2007-11-27 12:51:00
  • Oracle下时间转换在几种语言中的实现

    2009-02-28 11:09:00
  • Oracle入侵常用操作命令整理

    2009-03-04 11:11:00
  • SQL SERVER数据库开发之触发器的应用

    2008-06-23 13:09:00
  • rs.getrows的使用方法

    2008-04-05 14:01:00
  • 使用sp_xml_preparedocument处理XML文档的方法

    2011-09-30 11:56:15
  • 谈谈XHTML中CDATA

    2007-09-17 12:45:00
  • 纯CSS实现导航下拉菜单

    2007-11-25 15:11:00
  • 使用XMLhttp生成html页面

    2007-08-17 11:21:00
  • 用户研究角度看设计(1)“复制链接”的故事

    2008-12-26 17:48:00
  • 新手入门:防范SQL注入攻击的新办法

    2009-03-11 15:14:00
  • 设置密码保护的SqlServer数据库备份文件与恢复文件的方法

    2011-11-03 16:55:30
  • js中的文档模式-document.compatMode

    2009-08-14 20:30:00
  • Flash对象在(x)HTML中的格式和参数及安全性

    2010-04-01 11:55:00
  • 微软建议的ASP性能优化28条守则(4)

    2008-02-26 17:57:00
  • FrontPage2002简明教程一:安装与界面

    2008-08-17 11:04:00
  • 如何改良你的CSS代码编写结构

    2008-09-29 16:03:00
  • asp之家 网络编程 m.aspxhome.com