• 使用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@TestStringValuenvarchar(1024);
    SET@TestStringValue=(SELECTProductID,[Name]FROMProduction.Product
    WHEREProductSubcategoryID=9
    FORXMLAUTO);
    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@TestStringValuenvarchar(1024);
    SET@TestStringValue=(SELECTProductID,[Name]FROMProduction.Product
    WHEREProductSubcategoryID=9
    FORXMLAUTO,TYPE);
    不出意外,查询结果收到如下错误提示:
    不允许从数据类型xml 到nvarchar 的隐式转换。请使用CONVERT 函数来运行此查询。
    可见通过TYPE指令返回的数据已经转变成Xml类型,改进后的查询语句如下:
    DECLARE@XmlTestValuexml;
    SET@XmlTestValue=(SELECTProductID,[Name]FROMProduction.Product
    WHEREProductSubcategoryID=9
    FORXMLAUTO,TYPE);
    SELECT@XmlTestValue;
    通过SELECT 返回的结果支持Xml方式显示。
     
    了解了TYPE指令的功能后,就可以来看FOR XML查询带给开发者的更多惊喜。以示例数据库的产品表(Production.Product)和产品分类子类表(Production.ProductSubcategory)为例进行演示。
    编写产品子类别为“9”的产品数据查询:
    SELECTProductSubcategoryID,[Name],
    (SELECTProductID,[Name]FROMProduction.Product Product
       WHEREProductSubcategoryID=9
       FORXMLAUTO,TYPE)ASProducts
    FROMProduction.ProductSubcategoryASCategory
    WHEREProductSubcategoryID=9
    FORXMLAUTO;
    输出结果如下:
    <CategoryProductSubcategoryID="9"Name="Derailleurs">
     <Products>
        <ProductProductID="894"Name="Rear Derailleur"/>
        <ProductProductID="945"Name="Front Derailleur"/>
     </Products>
    </Category>
    如果在产品查询子句中不提供TYPE指令,那么输出就会变成下面结果:
    <CategoryProductSubcategoryID="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文档。
    WITHXMLNAMESPACES('uri0'asns0)
    SELECTProductSubcategoryID,[Name],
    (SELECTProductID,[Name]FROMProduction.Product Product
       WHEREProductSubcategoryID=9
       FORXMLRAW('ns0:Product'),TYPE)AS'ns0:Products'
    FROMProduction.ProductSubcategoryASCategory
    WHEREProductSubcategoryID=9
    FORXMLRAW('ns0:Category'),ROOT('ns0:Message');
    输出结果:
    <ns0:Messagexmlns:ns0="uri0">
     <ns0:CategoryProductSubcategoryID="9"Name="Derailleurs">
        <ns0:Products>
          <ns0:Productxmlns:ns0="uri0"ProductID="894"Name="Rear Derailleur"/>
          <ns0:Productxmlns:ns0="uri0"ProductID="945"Name="Front Derailleur"/>
        </ns0:Products>
     </ns0:Category>
    </ns0:Message>
     
    如果采用默认命名空间,编写SQL如下:
    WITHXMLNAMESPACES(DEFAULT'http://blog.csdn.net/zhzuo')
    SELECTProductSubcategoryID,[Name],
    (SELECTProductID,[Name]FROMProduction.Product Product
       WHEREProductSubcategoryID=9
       FORXMLAUTO,TYPE)ASProducts
    FROMProduction.ProductSubcategoryASCategory
    WHEREProductSubcategoryID=9
    FORXMLAUTO,ROOT('Message');
    输出结果:
    <Messagexmlns="http://blog.csdn.net/zhzuo">
     <CategoryProductSubcategoryID="9"Name="Derailleurs">
        <Products>
          <Productxmlns="http://blog.csdn.net/zhzuo"ProductID="894"Name="Rear Derailleur"/>
          <Productxmlns="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更为简单:
    WITHXMLNAMESPACES(DEFAULT'http://blog.csdn.net/zhzuo')
    SELECTProductIDAS'Product/@ProductID',
       NameAS'Product/Name'
    FROMProduction.Product
    WHEREProductSubcategoryID=9
    FORXMLPATH(''),ROOT('Products');
    输出结果:
    <Productsxmlns="http://blog.csdn.net/zhzuo">
     <ProductProductID="894">
        <Name>Rear Derailleur</Name>
     </Product>
     <ProductProductID="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来解决。
  • 相关阅读:
    [bbk2342] 第47集 Chapter 09Optimizing Sore Perations(02)
    [bbk2345] 第50集 Chapter 12Optimizing Sore Perations(05)
    [bbk2343] 第48集 Chapter 12Optimizing Sore Perations(03)
    [bbk2863] 第54集 Chapter 14Using Oracle Dasta Storage Structures Efficiently(00)
    [bbk2515] 第51集 Chapter 13Using Oracle Blokcs Efficeintly[00]
    [bbk2341] 第46集 Chapter 09Optimizing Sore Perations(01)
    [bbk2863] 第54集 Chapter 13Using Oracle Blokcs Efficeintly[03]
    [bbk2668] 第53集 Chapter 13Using Oracle Blokcs Efficeintly[02]
    [bbk2344] 第49集 Chapter 12Optimizing Sore Perations(04)
    QT 中的模态和非模态对话框
  • 原文地址:https://www.cnblogs.com/xiaofengfeng/p/1822725.html
Copyright © 2020-2023  润新知