SQL Server 2005 FOR XML嵌套查询使用详解

作者:伯尼 来源:赛迪网 时间:2009-01-06 11:20:00 

相比SQL Server 2000提供的FOR XML查询,SQL Server 2005版本对现有功能增强的基础上增加了不少新功能,最为吸引人的功能包括对Xml数据类型支持、使用PATH模式以及嵌套FOR XML查询支持等,这意味着通过新的FOR XML查询功能可以构造出结构更加灵活的Xml数据。

在SQL Server 2000中FOR XML查询的结果是直接以文本方式返回到客户端,为支持SQL Server 2005中的Xml数据类型,FOR XML 查询提供了TYPE指令,通过TYPE支持返回结果将会变为Xml数据类型。接下来以SQL Server2005中的AdventureWorks示例数据库为例演练其功能。

先来看第一个SQL查询:

DECLARE @TestStringValue nvarchar(1024);

SET @TestStringValue = (SELECT ProductID,[Name] FROM Production.Product

WHERE ProductSubcategoryID = 9

FOR XML AUTO);

SELECT @TestStringValue;

输出结果:

结果为字符串,只是内容格式符合Xml片段要求,不过无法在SQL Server Management Studio中点击以Xml方式显示。

下面对SQL进行修改,增加TYPE指令:

DECLARE @TestStringValue nvarchar(1024);

SET @TestStringValue = (SELECT ProductID,[Name] FROM Production.Product

WHERE ProductSubcategoryID = 9

FOR XML AUTO,TYPE);

不出意外,查询结果收到如下错误提示:

不允许从数据类型xml 到nvarchar 的隐式转换。请使用CONVERT 函数来运行此查询。

可见通过TYPE指令返回的数据已经转变成Xml类型,改进后的查询语句如下:

DECLARE @XmlTestValue xml;

SET @XmlTestValue = (SELECT ProductID,[Name] FROM Production.Product

WHERE ProductSubcategoryID = 9

FOR XML AUTO,TYPE);

SELECT @XmlTestValue;

通过SELECT 返回的结果支持Xml方式显示。

了解了TYPE指令的功能后,就可以来看FOR XML查询带给开发者的更多惊喜。以示例数据库的产品表(Production.Product)和产品分类子类表(Production.ProductSubcategory)为例进行演示。

编写产品子类别为“9”的产品数据查询:

SELECT ProductSubcategoryID,[Name] ,

(SELECT ProductID,[Name] FROM Production.Product Product

WHERE ProductSubcategoryID = 9

FOR XML AUTO,TYPE) AS Products

FROM Production.ProductSubcategory AS Category

WHERE ProductSubcategoryID = 9

FOR XML AUTO;

输出结果如下:

如果在产品查询子句中不提供TYPE指令,那么输出就会变成下面结果:

" />

以上几个查询结果都没有带命名空间,不过SQL Server 2005 通过WITH XMLNAMESPACES子句提供了对命名空间的支持,下面的查询将显示一个完整的带默认命名空间的Xml文档。

WITH XMLNAMESPACES ('uri0' as ns0)

SELECT ProductSubcategoryID,[Name] ,

(SELECT ProductID,[Name] FROM Production.Product Product

WHERE ProductSubcategoryID = 9

FOR XML RAW('ns0:Product'),TYPE) AS 'ns0:Products'

FROM Production.ProductSubcategory AS Category

WHERE ProductSubcategoryID = 9

FOR XML RAW('ns0:Category'),ROOT('ns0:Message');

输出结果:

如果采用默认命名空间,编写SQL如下:

WITH XMLNAMESPACES (DEFAULT 'http://blog.csdn.net/zhzuo')

SELECT ProductSubcategoryID,[Name] ,

(SELECT ProductID,[Name] FROM Production.Product Product

WHERE ProductSubcategoryID = 9

FOR XML AUTO,TYPE) AS Products

FROM Production.ProductSubcategory AS Category

WHERE ProductSubcategoryID = 9

FOR XML AUTO,ROOT('Message');

输出结果:

另外,在SQL Server 2005中增加了FOR XML PATH 模式,通过使用FOR XML PATH 模式可以建立清晰灵活的Xml格式,相比使用FOR XML EXPLICIT更为简单:

WITH XMLNAMESPACES (DEFAULT 'http://blog.csdn.net/zhzuo')

SELECT ProductID AS 'Product/@ProductID',

Name AS 'Product/Name'

FROM Production.Product

WHERE ProductSubcategoryID = 9

FOR XML PATH(''),ROOT('Products');

输出结果:

Rear Derailleur

Front Derailleur

在实际应用过程中,以.NET平台应用开发为例,通过ADO.NET访问SQL Server 2005返回的Xml数据结构可以更加丰富,甚至可以做到不做Xml样式转换直接服务于上一层模块。在企业应用集成方面,以BizTalk平台为例,在调用SQL Adapter的时候可以更加灵活,降低为了制定合理Xml Schema带来的复杂性。目前,最新版本的BizTalk(2006 R2)对使用了SQL Server 2005加强FOR XML功能的存储过程或SQL语句不支持通过SQL适配器向导生成XML Schema,不过这个问题可以直接通过Visual Studio IDE编写符合实际格式的XML Schema来解决。

标签:
0
投稿

猜你喜欢

  • javaScript中一些常见的数据类型检查校验

    2023-07-02 05:19:09
  • asp中的on error resume next用法

    2008-03-09 15:22:00
  • python 解决动态的定义变量名,并给其赋值的方法(大数据处理)

    2021-10-09 10:44:58
  • Python入门学习指南分享

    2023-09-02 15:02:21
  • 加载 Javascript 最佳实践

    2011-01-16 18:29:00
  • PHP编程入门的基本语法知识点总结

    2023-06-14 11:16:36
  • 基于js里调用函数时,函数名带括号和不带括号的区别

    2023-08-24 05:05:41
  • SQL Server 2000中的触发器使用

    2024-01-15 15:33:34
  • 网页视频播放器程序代码(通用代码),支持avi,wmv,asf,mov,rm,ra,ram等

    2008-07-16 11:56:00
  • 浅谈Python 命令行参数argparse写入图片路径操作

    2023-03-18 21:08:11
  • 微信公众平台开发教程⑤ 微信扫码支付模式介绍

    2023-11-14 10:40:10
  • python监控文件或目录变化

    2023-09-05 16:08:28
  • python with (as)语句实例详解

    2023-04-12 04:15:09
  • MySQL 导出数据为csv格式的方法

    2024-01-26 04:52:57
  • 两个命令把 Vim 打造成 Python IDE的方法

    2022-01-20 09:31:31
  • JSP学生信息管理系统设计

    2023-07-13 03:37:30
  • JS getRandomValues和Math.random方法深入解析

    2024-04-17 09:54:42
  • Vue.js 时间转换代码及时间戳转时间字符串

    2024-04-30 10:21:53
  • Vue之使用mockjs生成模拟数据案例详解

    2024-05-29 22:24:40
  • Django实现jquery select2带搜索的下拉框

    2022-04-20 18:50:58
  • asp之家 网络编程 m.aspxhome.com