网络编程
位置:首页>> 网络编程>> 数据库>> 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
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com