当前位置: 首页 > 图文教程 > 数据库 > MSSQL > 详解SQL Server 2005 FOR XML嵌套查询的使用

MSSQL
SQL SERVER乐观锁定和悲观锁定使用实例
SQL Server 对文件内容进行全文检索的查询
MSSQL 2005的新功能创建数据库快照
给SQL Server Model数据库增加一些变化
拷贝的SQLServer7数据库的恢复方法
如何紧急恢复SQL Server主数据库
SQL Server 2000在win2003上安装不上的解决办法
MySQL 5.0新特性教程 存储过程:第一讲
Web环境下MSSQL Server中数据的磁带备份与恢复
用SQL 2005的ROW_NUMBER() 实现分页功能
SQL Server 2005的100范例程序及数据库下载
sql server2000导入mdf文件
简单SQL语句小结
了解SQL Server 2005五个有用的动态管理对象
使SQL Server数据支持 XML
Sql Server 2000数据库日志日益庞大的解决方法
怎么导出SQL所有用户表的字段信息
保护 SQLServer 2005 Express Edition Server
如何修改SQLServer 2000身份验证模式和系统管理员
简单介绍:MS-SQL数据库开发常用汇总

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-30   浏览: 172 ::
收藏到网摘: n/a

 相比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