在SQl 2005 For XMl 簡單查詢(Raw,Auto,Path模式)(1) 里我們說了關于Path,Raw和Auto模式的用法,其實里面不僅僅 是這些簡單的操作,還有一些其它的特性,比如說Type或OpenXml方法,sp_xml_preparedocument存儲過程 等這些增加的東東,我們來一個一個的看吧,
第一個Type關鍵字,Type大家都 知道 英文意思是類型,在這里也是和類型相關的,意思就是說讓子集里面類型和集合的類型統一,具體 是怎么統一的這個我也不懂,大家還得自己去查或是找找MS的網站吧,我們還用上一節的數據庫和表來實現具體表的結構還請大家參考SQl 2005 For XMl 簡單查詢(Raw,Auto,Path模式)(1)里面的 我們來做寫一個這樣的子查詢
SELECT SID,SName,(SELECT ClassInfo.CName from ClassInfo WHERE ClassInfo.CID=Students.CID FOR xml raw)
FROM Students
ORDER BY CID FOR xml auto
復制代碼
我們可以清楚的看到子查詢返回的是一個Xml類型的而外面的集合也是一個Xml類型的,這個時候如果我們直接執行的話就會發生錯誤
消息 6809,級別 16,狀態 1,第 1 行
不能將未命名的表用作 XML 標識符,也不能將未命名的列用于屬性名稱。請在 SELECT 語句中使用 AS 對未命名的列/表進行命名。
我們知道 如果是正常的情況下是可以的,無非就是這一列沒有列名,但是是不會報錯的,那這個時候我們就可以這樣來寫了
SELECT SID,SName,(SELECT ClassInfo.CName from ClassInfo WHERE ClassInfo.CID=Students.CID FOR xml raw,type)
FROM Students
ORDER BY CID FOR xml auto
復制代碼
只要在子集的后面加上一個Type就可以了,我們的Type就是在這種情況下使用的,也可能是我了解的太少了,我個人感覺 這個東東是沒有什么太大的用處的,我們可以這樣來寫
SELECT SID,SName,(SELECT ClassInfo.CName from ClassInfo WHERE ClassInfo.CID=Students.CID FOR xml path) AS '班級'
FROM Students
ORDER BY CID FOR xml auto
復制代碼
只要我們給這一列起一個別名,無論你使用那種模式都 不用加什么Type了,所以最少在這個時候基本不用使用誰會讓一列沒有名稱呢?
大家把語句直接執行就Ok了,
我們來看第二個OpenXml方法,他其實要和sp_xml_preparedocument存儲過程合起來用比較好,我們來看個例子吧
declare @docxml xml;
set @docxml='
DECLARE @handel int;
EXEC sp_xml_preparedocument @handel output, @docxml
SELECT * from OPENXML(@handel,'/st/row',2)
WITH(SID int ,SName varchar(50),CName varchar(50))
查詢得到的結果
一個一個的分析一下吧,sp_xml_preparedocument是把一個Xml文件轉成XmlDocument文檔形式
而OpenXml是在XmlDocument中查詢出相應的內容關轉成Table形式輸出也可以是視圖,OPENXML 是一個行集提供程序,類似于表或視圖,提供內存中 XML 文檔上的行集。OPENXML 通過提供 XML 文檔內部表示形式的行集視圖,允許訪問 XML 數據,就像它是關系行集一樣。行集中的記錄可以存儲在數據庫表中。OPENXML 可在用于指定源表或源視圖的 SELECT 和 SELECT INTO 語句中使用。
首先 sp_xml_preparedocument 存儲過程分析 XML 文檔。分析后的文檔是 XML 文檔中各節點(元素、屬性、文本和注釋)的樹狀表示形式。然后,OPENXML 引用此經過分析的 XML 文檔,并提供此 XML 文檔全部或部分內容的行集視圖。使用 OPENXML 的 INSERT 語句可將數據從這樣的行集插入數據庫表中??梢允褂枚鄠€ OPENXML 調用來提供 XML 文檔中各部分的行集視圖,并對它們進行處理,例如,將它們插入不同的表中。此過程也稱為“將 XML 拆分到表中”。
SQL Server 2005 聯機叢書(2008 年 11 月)
使用 OPENXML 查詢 XML
OPENXML 是一個 Transact-SQL 關鍵字,對內存中的 XML 文檔提供與表或視圖相似的行集。OPENXML 允許像訪問關系行集一樣訪問 XML 數據。它通過提供以內部形式表示的 XML 文檔的行集視圖來實現這一點。行集中的記錄可以存儲在數據庫表中。
無論行集提供程序(視圖或 OPENROWSET)可以在何處作為源出現,都可以在 SELECT 和 SELECT INTO 語句中使用 OPENXML。有關 OPENXML 語法的信息,請參見 OPENXML (Transact-SQL)。
若要使用 OPENXML 編寫對 XML 文檔執行的查詢,必須先調用 sp_xml_preparedocument。它將分析 XML 文檔并向準備使用的已分析文檔返回一個句柄。已分析文檔以文檔對象模型 (DOM) 樹的形式說明 XML 文檔中的各種節點。該文檔句柄傳遞給 OPENXML。然后 OPENXML 根據傳遞給它的參數提供一個該文檔的行集視圖。
必須通過調用 sp_xml_removedocument 系統存儲過程從內存中刪除以內部形式表示的 XML 文檔來釋放內存。
原文轉自:http://www.anti-gravitydesign.com