使用SQL Server 2005 FOR XML嵌套查询
2010-09-09 23:38
323 查看
[align=left]相比SQL Server 2000提供的FOR XML查询,SQL Server 2005版本对现有功能增强的基础上增加了不少新功能,最为吸引人的功能包括对Xml数据类型支持、使用PATH模式以及嵌套FOR XML查询支持等,这意味着通过新的FOR XML查询功能可以构造出结构更加灵活的Xml数据。[/align]
[align=left]在SQL Server 2000中FOR XML查询的结果是直接以文本方式返回到客户端,为支持SQL Server 2005中的Xml数据类型,FOR XML 查询提供了TYPE指令,通过TYPE支持返回结果将会变为Xml数据类型。接下来以SQL Server2005中的AdventureWorks示例数据库为例演练其功能。[/align]
[align=left]先来看第一个SQL查询:[/align]
[align=left]输出结果:[/align]
[align=left]结果为字符串,只是内容格式符合Xml片段要求,不过无法在SQL Server Management Studio中点击以Xml方式显示。[/align]
[align=left]下面对SQL进行修改,增加TYPE指令:[/align]
[align=left]不出意外,查询结果收到如下错误提示:[/align]
[align=left]不允许从数据类型xml 到nvarchar 的隐式转换。请使用CONVERT 函数来运行此查询。[/align]
[align=left]可见通过TYPE指令返回的数据已经转变成Xml类型,改进后的查询语句如下:[/align]
[align=left]通过SELECT 返回的结果支持Xml方式显示。[/align]
[align=left] [/align]
[align=left]了解了TYPE指令的功能后,就可以来看FOR XML查询带给开发者的更多惊喜。以示例数据库的产品表(Production.Product)和产品分类子类表(Production.ProductSubcategory)为例进行演示。[/align]
[align=left]编写产品子类别为“9”的产品数据查询:[/align]
[align=left]输出结果如下:[/align]
[align=left]如果在产品查询子句中不提供TYPE指令,那么输出就会变成下面结果:[/align]
[align=left] [/align]
[align=left]以上几个查询结果都没有带命名空间,不过SQL Server 2005 通过WITH XMLNAMESPACES子句提供了对命名空间的支持,下面的查询将显示一个完整的带默认命名空间的Xml文档。[/align]
[align=left]输出结果:[/align]
[align=left] [/align]
[align=left]如果采用默认命名空间,编写SQL如下:[/align]
[align=left]输出结果:[/align]
[align=left] [/align]
[align=left]另外,在SQL Server 2005中增加了FOR XML PATH 模式,通过使用FOR XML PATH 模式可以建立清晰灵活的Xml格式,相比使用FOR XML EXPLICIT更为简单:[/align]
[align=left]输出结果:[/align]
[align=left] [/align]
[align=left]在实际应用过程中,以.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来解决。[/align]
[align=left]在SQL Server 2000中FOR XML查询的结果是直接以文本方式返回到客户端,为支持SQL Server 2005中的Xml数据类型,FOR XML 查询提供了TYPE指令,通过TYPE支持返回结果将会变为Xml数据类型。接下来以SQL Server2005中的AdventureWorks示例数据库为例演练其功能。[/align]
[align=left]先来看第一个SQL查询:[/align]
[align=left]DECLARE@TestStringValuenvarchar(1024);[/align] [align=left]SET@TestStringValue=(SELECTProductID,[Name]FROMProduction.Product[/align] [align=left]WHEREProductSubcategoryID=9[/align] [align=left]FORXMLAUTO);[/align] [align=left]SELECT@TestStringValue;[/align] |
[align=left]<Production.Product ProductID="894" Name="Rear Derailleur"/><Production.Product ProductID="945" Name="Front Derailleur"/>[/align] |
[align=left]下面对SQL进行修改,增加TYPE指令:[/align]
[align=left]DECLARE@TestStringValuenvarchar(1024);[/align] [align=left]SET@TestStringValue=(SELECTProductID,[Name]FROMProduction.Product[/align] [align=left]WHEREProductSubcategoryID=9[/align] [align=left]FORXMLAUTO,TYPE);[/align] |
[align=left]不允许从数据类型xml 到nvarchar 的隐式转换。请使用CONVERT 函数来运行此查询。[/align]
[align=left]可见通过TYPE指令返回的数据已经转变成Xml类型,改进后的查询语句如下:[/align]
[align=left]DECLARE@XmlTestValuexml;[/align] [align=left]SET@XmlTestValue=(SELECTProductID,[Name]FROMProduction.Product[/align] [align=left]WHEREProductSubcategoryID=9[/align] [align=left]FORXMLAUTO,TYPE);[/align] [align=left]SELECT@XmlTestValue;[/align] |
[align=left] [/align]
[align=left]了解了TYPE指令的功能后,就可以来看FOR XML查询带给开发者的更多惊喜。以示例数据库的产品表(Production.Product)和产品分类子类表(Production.ProductSubcategory)为例进行演示。[/align]
[align=left]编写产品子类别为“9”的产品数据查询:[/align]
[align=left]SELECTProductSubcategoryID,[Name],[/align] [align=left](SELECTProductID,[Name]FROMProduction.Product Product[/align] [align=left] WHEREProductSubcategoryID=9[/align] [align=left] FORXMLAUTO,TYPE)ASProducts[/align] [align=left]FROMProduction.ProductSubcategoryASCategory[/align] [align=left]WHEREProductSubcategoryID=9[/align] [align=left]FORXMLAUTO;[/align] |
[align=left]<CategoryProductSubcategoryID="9"Name="Derailleurs">[/align] [align=left] <Products>[/align] [align=left] <ProductProductID="894"Name="Rear Derailleur"/>[/align] [align=left] <ProductProductID="945"Name="Front Derailleur"/>[/align] [align=left] </Products>[/align] [align=left]</Category>[/align] |
[align=left]<CategoryProductSubcategoryID="9"Name="Derailleurs"Products="<Product ProductID="894"Name="Rear Derailleur"/><Product ProductID="945"Name="Front Derailleur"/>"/>[/align] |
[align=left]以上几个查询结果都没有带命名空间,不过SQL Server 2005 通过WITH XMLNAMESPACES子句提供了对命名空间的支持,下面的查询将显示一个完整的带默认命名空间的Xml文档。[/align]
[align=left]WITHXMLNAMESPACES('uri0'asns0)[/align] [align=left]SELECTProductSubcategoryID,[Name],[/align] [align=left](SELECTProductID,[Name]FROMProduction.Product Product[/align] [align=left] WHEREProductSubcategoryID=9[/align] [align=left] FORXMLRAW('ns0:Product'),TYPE)AS'ns0:Products'[/align] [align=left]FROMProduction.ProductSubcategoryASCategory[/align] [align=left]WHEREProductSubcategoryID=9[/align] [align=left]FORXMLRAW('ns0:Category'),ROOT('ns0:Message');[/align] |
[align=left]<ns0:Messagexmlns:ns0="uri0">[/align] [align=left] <ns0:CategoryProductSubcategoryID="9"Name="Derailleurs">[/align] [align=left] <ns0:Products>[/align] [align=left] <ns0:Productxmlns:ns0="uri0"ProductID="894"Name="Rear Derailleur"/>[/align] [align=left] <ns0:Productxmlns:ns0="uri0"ProductID="945"Name="Front Derailleur"/>[/align] [align=left] </ns0:Products>[/align] [align=left] </ns0:Category>[/align] [align=left]</ns0:Message>[/align] |
[align=left]如果采用默认命名空间,编写SQL如下:[/align]
[align=left]WITHXMLNAMESPACES(DEFAULT'http://blog.csdn.net/zhzuo')[/align] [align=left]SELECTProductSubcategoryID,[Name],[/align] [align=left](SELECTProductID,[Name]FROMProduction.Product Product[/align] [align=left] WHEREProductSubcategoryID=9[/align] [align=left] FORXMLAUTO,TYPE)ASProducts[/align] [align=left]FROMProduction.ProductSubcategoryASCategory[/align] [align=left]WHEREProductSubcategoryID=9[/align] [align=left]FORXMLAUTO,ROOT('Message');[/align] |
[align=left]<Messagexmlns="http://blog.csdn.net/zhzuo">[/align] [align=left] <CategoryProductSubcategoryID="9"Name="Derailleurs">[/align] [align=left] <Products>[/align] [align=left] <Productxmlns="http://blog.csdn.net/zhzuo"ProductID="894"Name="Rear Derailleur"/>[/align] [align=left] <Productxmlns="http://blog.csdn.net/zhzuo"ProductID="945"Name="Front Derailleur"/>[/align] [align=left] </Products>[/align] [align=left] </Category>[/align] [align=left]</Message>[/align] |
[align=left]另外,在SQL Server 2005中增加了FOR XML PATH 模式,通过使用FOR XML PATH 模式可以建立清晰灵活的Xml格式,相比使用FOR XML EXPLICIT更为简单:[/align]
[align=left]WITHXMLNAMESPACES(DEFAULT'http://blog.csdn.net/zhzuo')[/align] [align=left]SELECTProductIDAS'Product/@ProductID',[/align] [align=left] NameAS'Product/Name'[/align] [align=left]FROMProduction.Product[/align] [align=left]WHEREProductSubcategoryID=9[/align] [align=left]FORXMLPATH(''),ROOT('Products');[/align] |
[align=left]<Productsxmlns="http://blog.csdn.net/zhzuo">[/align] [align=left] <ProductProductID="894">[/align] [align=left] <Name>Rear Derailleur</Name>[/align] [align=left] </Product>[/align] [align=left] <ProductProductID="945">[/align] [align=left] <Name>Front Derailleur</Name>[/align] [align=left] </Product>[/align] [align=left]</Products>[/align] |
[align=left]在实际应用过程中,以.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来解决。[/align]
相关文章推荐
- sql server 2005的两个引擎和Go的使用笔记
- Java/JSP中使用JDBC连接SQL Server 2005(转自 秋忆)
- sql server 2005 使用备忘
- 黄聪:SQL Server 2005开窗函数的使用
- java中使用jdbc连接sql server 2005
- 使用SQL Server 2005 新的语法ROW_NUMBER()进行分页的两种不同方式的性能比较
- sql server 2005中使用with实现递归
- SQL Server 2005------查询优化器如何使用统计
- sql server 2005中使用with实现递归的方法
- 将ASP.NET 2.0应用程序服务配置为使用SQL Server 2000或2005
- SQL Server 2005 导出包含(insert into)数据的SQL脚本 (使用存储过程)
- Java/JSP中使用JDBC连接SQL Server 2000/2005
- SQL Server 2005使用基于行版本控制的隔离级别初探
- SQL Server 2005中使用事务发布实现数据库复制
- 为 Analysis Services 数据库使用扩展字段属性(SQL Server 2005 联机丛书(2008 年 11 月))
- 将 ASP.NET 2.0 应用程序服务配置为使用 SQL Server 2000 或 SQL Server 2005
- SQL Server 2005 Express 使用心得
- 基于Asp.Net 2.0(C#)和SQL Server 2005使用DSOFramer全攻略
- SQL SERVER 2005中使用sql语句对xml 文件和其数据的进行操作(很全面)
- 使用VS 2005 在SQL Server 2005 中创建自定义函数 UDF 时发生的问题