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'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's Cajun Seasoning
1
Chai
2
Chang
3> 使用xmltext指令
该指令是用来处理包含xml片断内容的数据列,没找到现成的表结构和数据进行测试,所以就在Categories表中增加了XmlData列名,类型为nvarchar,默认值设置为“”。
查询语句:
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...
猜你喜欢
- 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组件进行数据库编程时,通常是在脚本的开头打开一个连接,并在脚本的最后关闭它,但是就较大脚本而言,在多数情况下连