网络编程
位置:首页>> 网络编程>> 数据库>> SQL Server 2000数据库FOR XML查询概述(2)

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
投稿

猜你喜欢

  • MySQL的ODBC接口实现是通过安装MyODBC驱动,这个驱动程序是跨平台的。如果在Linux等Unix体系操作系统下使用,需要先安装Io
  • 在文章《用CSS实现柱状图(Bar Graph)的方法总结与比较(三)》中我强调说不同浏览器对于相同元素的默认样式并不一致,这也是为什么我们
  • 如果我们希望把一个网站的更新实时发布到另一个网站上,最好的方法是通过 RSS 进行转载。如果只是需要简单的对更新的条目做个提示的话,使用 J
  • 服务器重新启动的情况当mysqld启动时,所有的授权表内容被读进存储器并且从那时开始生效。被服务器立即应用的情况用GRANT、REVOKE或
  • ASP具备动态输出任一Office应用程序文件格式的功能。在开始编写代码之前,我们首先需要做的就是设置正确的文件类型,因为浏览器需要知道如何
  • test.asp 测试演示文件clsrsa.asp 实现rsa加密与解密的vbs类文件下面是代码:1. test.asp<%rem 文
  • Inserted 表中的行是触发器表中新行的副本。 语法 返回所有列 INSERT INTO [tableName] ([columnNam
  • 本文整理了3种鼠标经过图片,图片边框加粗或改变颜色的方法,希望大家喜欢。下面3中只是提供了一个方法,具体的鼠标经过图片的样式,你自己可以修改
  • Session StaticObjects 集合StaticObjects 集合包含 Session 对象范围中用 <OBJECT&g
  • 在XHTML标签中有一些标签的作用是相似的,当然这里的相似是指语义相似,以至于很多人都不清楚这些相似的标签如何使用,那么今天的主题就是分解相
  • 前段时间在开发雨哲树网程序的时候,遇到需要转换地址中的参数,需要用到简单可逆运算的加密功能。在网上找了很多都不理想。因为我需要的这个可逆运算
  •  IIS上设置301 跳转相信大家都会,只要在网站-属性-主目录里 选择重定向URL就行了,这样整站就跳转到目标站点了,但是有个问
  • 用ASP实现搜索引擎的功能是一件很方便的事,可是,如何实现类似3721的智能搜索呢?比如,当在搜索条件框内输入“中国人民”时,自动从中提取“
  • 客户需要一个类似 news letter 的功能,当然,内容是可编辑的,而且还要以 HTML 格式呈现给用户。这就需要在发送邮件的时候,指明
  • 起源:.clearfix:after {visibility: hidden;display: block;font-size: 0;con
  • CSS 中的 position 属性可以很容易的将指定的元素定位到理想的位置。但在使用这一属性时需要注意,尤其是在表格元素中。为了说明此问题
  •  代码如下:Create PROCEDURE Batch_Delete @TableName nvarchar(100), --表
  • 本文介绍使用ADODB.Stream组件来下载服务器文件,例如:download.asp?file=相对路径的文件。就可以把这个文件下载下来
  • 有这样一个要求,它要创建一个SQL Server查询,其中包括基于事件时刻的累计值。典型的例子就是一个银行账户,因为你每一次都是在不同的时间
  • 我们在使用ASP 内置的ADO组件进行数据库编程时,通常是在脚本的开头打开一个连接,并在脚本的最后关闭它,但是就较大脚本而言,在多数情况下连
手机版 网络编程 asp之家 www.aspxhome.com