SqlServer 2005處理xml格式 (轉)

iSQlServer發表於2010-08-23
今天,在csdn上看到一則處理xml的問題,以前也有寫過xml的查詢,下面是問題 
01 declare @x xml,@y xml
02 set @x=' 
03 1  
04 姓名  
05  
06  
07  
08 2  
09 年齡  
10  
11  
12 '
13 set @y=' 
14 1  
15 張三  
16  
17  
18 2  
19 20  
20  
21 '有連個變數如上所示:
22 現在要求得到下面的格式:
23 /*
24
25     1
26     姓名
27     張三
28
29
30     2
31     年齡
32     20
33
34 */

      下面是xml操作的答案:

01 select  
02         D.x.value('./id[1]','int') AS id,
03         D.x.value('./title[1]','nvarchar(100)') AS title,
04         D.x.value('./value[1]','nvarchar(100)') AS [value]
05     from @x.nodes('/*') as D(x)
06       
07 ;with t1
08 as(
09     select  
10         D.x.value('./id[1]','int') AS id,
11         D.x.value('./title[1]','nvarchar(100)') AS title,
12         D.x.value('./value[1]','nvarchar(100)') AS [value]
13     from @x.nodes('/*') as D(x)),
14 t2
15 as(
16     select  
17         D.x.value('./id[1]','int') AS id,
18         D.x.value('./value[1]','nvarchar(100)') AS [value]
19     from @y.nodes('/*') as D(x))
20 select a.id,title,b.[value]
21 from t1 as a
22 left join t2 as b on a.id = b.id
23 for xml path('item')

    隨著標準化的執行,我相信以後sql裡會有更多對xml的操作。

    下面解讀一下上面的sql:

WITH AS短語,也叫做子查詢部分(subquery factoring),可以讓你做很多事情,定義一個SQL片斷,該SQL片斷會被整個SQL語句所用到。有的時候,是為了讓SQL語句的可讀性更高些,也有可能是在UNION ALL的不同部分,作為提供資料的部分。
特別對於UNION ALL比較有用。因為UNION ALL的每個部分可能相同,但是如果每個部分都去執行一遍的話,則成本太高,所以可以使用WITH AS短語,則只要執行一遍即可。如果WITH AS短語所定義的表名被呼叫兩次以上,則優化器會自動將WITH AS短語所獲取的資料放入一個TEMP表裡,如果只是被呼叫一次,則不會。而提示materialize則是強制將WITH AS短語裡的資料放入一個全域性臨時表裡。很多查詢通過這種方法都可以提高速度。

    然後就是兩個對xml操作的函式:

如果希望將 XML 資料型別例項拆分為關係資料,nodes() 方法十分有用。它允許您標識將對映到新行的節點。

每一個 xml 資料型別例項都具有隱式提供的上下文節點。對於在列或變數中儲存的 XML 例項來說,它是文件節點。文件節點是位於每個 xml 資料型別例項頂部的隱式節點。 nodes() 方法的結果是一個包含原始 XML 例項的邏輯副本的行集。在這些邏輯副本中,每個行示例的上下文節點都被設定成由查詢表示式標識的節點之一。這樣,後續的查詢可以瀏覽與這些上下文節點相關的節點。 您可以從行集中檢索多個值。例如,可以將 value() 方法應用於 nodes() 所返回的行集,從原始 XML 例項中檢索多個值。請注意,當 value() 方法應用於 XML 例項時,它僅返回一個值。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16436858/viewspace-671650/,如需轉載,請註明出處,否則將追究法律責任。

相關文章