使用SQL Server 2005 FOR XML嵌套查询

相比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 ;
输出结果:
<Production.Product ProductID="894" Name="Rear Derailleur"/><Production.Product ProductID="945" Name="Front Derailleur"/>
结果为字符串,只是内容格式符合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 ;
输出结果如下:
< Category ProductSubcategoryID =" 9" Name =" Derailleurs" >
 < Products >
    < Product ProductID =" 894" Name =" Rear Derailleur" />
    < Product ProductID =" 945" Name =" Front Derailleur" />
 </ Products >
</ Category >
如果在产品查询子句中不提供TYPE指令,那么输出就会变成下面结果:
< Category ProductSubcategoryID =" 9" Name =" Derailleurs" Products =" &lt; Product ProductID= &quot; 894 &quot; Name= &quot; Rear Derailleur &quot; / &gt;&lt; Product ProductID= &quot; 945 &quot; Name= &quot; Front Derailleur &quot; / &gt;" />
以上几个查询结果都没有带命名空间,不过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' );
输出结果:
< ns0:Message xmlns:ns0 =" uri0" >
 < ns0:Category ProductSubcategoryID =" 9" Name =" Derailleurs" >
    < ns0:Products >
      < ns0:Product xmlns:ns0 =" uri0" ProductID =" 894" Name =" Rear Derailleur" />
      < ns0:Product xmlns:ns0 =" uri0" ProductID =" 945" Name =" Front Derailleur" />
    </ ns0:Products >
 </ ns0:Category >
</ 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' );
输出结果:
< Message xmlns =" http://blog.csdn.net/zhzuo" >
 < Category ProductSubcategoryID =" 9" Name =" Derailleurs" >
    < Products >
      < Product xmlns =" http://blog.csdn.net/zhzuo" ProductID =" 894" Name =" Rear Derailleur" />
      < Product xmlns =" http://blog.csdn.net/zhzuo" ProductID =" 945" Name =" Front Derailleur" />
    </ Products >
 </ Category >
</ 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' );
输出结果:
< Products xmlns =" http://blog.csdn.net/zhzuo" >
 < Product ProductID =" 894" >
    < Name >Rear Derailleur </ Name >
 </ Product >
 < Product ProductID =" 945" >
    < Name >Front Derailleur </ Name >
 </ Product >
</ Products >
在实际应用过程中,以.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来解决。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值