賽迪網 > IT技術 數據庫 > 精彩更新
  IT資訊搜索
 
IT產品搜索
[程式開發][網管世界][網路安全][數據庫技術]
[作業系統][嘉賓聊天·線上訪談][活動集錦]
[精彩專題][Symantec專區][訂閱IT技術週刊]
[開發論壇][網管論壇][安全論壇][數據庫論壇]
[作業系統論壇][Sybase專區][IBM dW技術專區]
[病毒求助][病毒與漏洞播報][文檔·源碼下載]

SQL Server 2005 FOR XML嵌套查詢使用詳解

發佈時間:2008.07.17 04:43     來源:賽迪網    作者:伯尼

【賽迪網-IT技術報道】相比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

在實際應用過程中,以.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來解決。(責任編輯:盧兆林)


[ 發表評論 ] 字體[  ] [ 列印 ] [ 進入博客 ] [ 進入論壇 ]  [ 推薦給朋友 ]
  相關文章
  客戶需求反饋表
* 姓  名:
更多資料  了解方案  認識廠商
* 單位名稱:
* 聯繫電話:
* 電子郵件:
  賽迪推薦  
  手機·資費 ·新品·導購·評測·手機資費·寬帶
手機搜索  諾基亞 N73 MOTO Z6
  IT產品 ·筆記本·臺式機·伺服器·列印·投影
IT產品搜索 
  IT技術 ·開發·網管·安全·數據庫·作業系統
  資訊化 ·熱點·專題·訪談·週刊·方案案例
· IT治理撞入“死衚同”的七大誘因 應如何避開
· 互聯網零售業醞釀新物種 零售基因資訊化變異
· ERP案例分析 SaaS帶來衝擊 IT服務商面臨挑戰
· 通方期貨CRM解決方案 房地產行業CRM解決方案
  IT博客 ·曾劍秋·項立剛·Java學習·網管
  IT技術論壇 ·開發·網管·安全·數據庫·系統