程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> 使用SQL Server 2005 FOR XML嵌套查詢

使用SQL Server 2005 FOR XML嵌套查詢

編輯:關於SqlServer


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



  輸出結果如下:

<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文檔。

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: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如下:

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');

輸出結果:
<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更為簡單:

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');

輸出結果:
<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來解決。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved