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...


猜你喜欢
- 本文实例为大家分享了python3实现多张图片附件邮件发送的具体代码,供大家参考,具体内容如下直接上代码,没有注释!from email.m
- 找了半天,以为numpy的where函数像matlab 的find函数一样好用,能够返回一个区间内的元素索引位置。结果没有。。(也可能是我没
- 翻译:用法:zeros(shape, dtype=float, order='C')返回:返回来一个给定形状和类型的用0填充
- 安装时是需要设置python环境变量的,下载python的时候底下有个小框框(没有默认选中)Add Python 3.7 to PATH需要
- 我所接触的多标签数据,主要包括两类:1、一张图片属于多个标签,比如,data:一件蓝色的上衣图片.jpg,label:蓝色,上衣。其中lab
- 一、简介urllib 库,它是 Python 内置的 HTTP 请求库,不需要额外安装即可使用,它包含四个模块:`request` 请求模块
- list*n生成多维数组与for循环生成多维数组的区别本文主要介绍生成二维数组的方法,同时解释使用list * n 方式所存在的问题。1.从
- 框架介绍在之前的.NET中,微软还没有提供过像样的日志框架,目前能用的一些框架比如Log4Net、NLog、CommonLogging使用起
- aspjpeg版本:v1.801 将pic.jpg打上logo.png,可根据图片大小对水印图做适当调整 &
- 本文实例总结了GO语言基本数据类型。分享给大家供大家参考。具体如下:1、注释(与C++一样)行注释://块注释:/* ...*/2、标识符可
- 本文实例讲述了python使用any判断一个对象是否为空的方法。分享给大家供大家参考。具体实现代码如下:>>> eth =
- oracle如果存储过程比较复杂,我们要定位到错误就比较困难,那么可以存储过程的调试功能先按简单的存储过程做个例子,就是上次做的存储过程(p
- 【导语】:对自己写的冗长代码,想重构但又无思路?小编整理了系列介绍python代码重构优化的方法,助你一臂之力。编写干净的 Pythonic
- 下面是实现代码# coding:utf-8import time, serialfrom struct import *import bin
- 来源:在工作过程中,需要统计一些trace信息,也就是一些打点信息,而打点是通过关键字进行的,因此对一个很大的文件进行分析时,想把两个打点之
- 我就废话不多说了,大家还是直接看代码吧~import numpy as np kernel = np.array([1, 1, 1, 2])
- window对象:打开和关闭窗口:window.open()三个参数:1.载入新窗口的页面的URL 2.新窗口的名字
- 本文介绍了asp编程中使用数组的各种方法,并给出了详细的asp实例代码方便大家理解。asp中数组的定义Dim MyArray My
- 1.基于OpenCV的形状检测Python版本目录结构1.1.定义我们的形状检测器类ShapeDetector开始定义我们的 ShapeDe
- 我的长博文不少,比较影响阅读体验,有必要添加一个文章目录功能。相比 Wordpress, Typecho 的插件就比较少了。我想找一个像掘金