T-SQL XQuery (XML路徑查詢) (轉)http://blog.csdn.net/Beirut/article/details/8150116

  1 /*
  2 T-SQL 支持用於查詢 XML 數據類型的 XQuery 語言的子集。
  3 XQuery 基於現有的 XPath 查詢語言,並支持更好的迭代、更好的排序結果以及構造必需的 XML 的功能。
  4 在前面咱們已經學習了 XPath 的基本語法,本章將學習T-SQL 的 XQuery 語法
  5 ------------------------------------------------------------------------------------------------------------------   
  6 T-SQL XQuery包含以下函數
  7 query(XPath條件):  結果爲 xml 類型; 返回由符合條件的節點組成的非類型化的 XML 實例
  8 value(XPath條件,數據類型):結果爲指定的標量值類型; xpath條件結果必須惟一
  9 exist(XPath條件):結果爲布爾值; 表示節點是否存在,若是執行查詢的 XML 數據類型實例包含NULL則返回NULL
 10 nodes(XPath條件): 返回由符合條件的節點組成的一行一列的結果表
 11 */
 12 
 13 DECLARE @x XML 
 14 SET @x='
 15 <root>
 16   <rogue id="001">
 17     <hobo id="1">
 18       <name>彪</name>
 19       <name>阿彪</name>
 20       <type>流氓</type>
 21     </hobo>
 22   </rogue>
 23   <rogue id="002">
 24     <hobo id="2">
 25       <name>光輝</name>
 26       <name>二輝</name>
 27       <type>流氓</type>
 28     </hobo>
 29   </rogue>
 30   <rogue id="001">
 31     <hobo id="3">
 32       <name>小德</name>
 33       <name>小D</name>
 34       <type>臭流氓</type>
 35     </hobo>
 36   </rogue>
 37 </root>'
 38 --取root的全部子節點
 39 --SELECT @x.query('root'),@x.query('/root'),@x.query('.')
 40 --/*註釋:
 41 --    這裏其實是取全部節點,root 必須是最高級節點名稱,當換成任意子節點都是取不到值的
 42 --*/
 43 --取 hobo 的全部子節點,無論 hobo 在文檔中的位置。
 44 SELECT @x.query('//hobo')
 45 ----擴展:取rogue下 全部  name
 46 SELECT @x.query('//rogue//name')
 47 --取屬性爲id 的全部節點
 48 SELECT @x.query('//hobo[@id]')
 49 /*註釋:
 50     XQuery不支持直接頂級 attribute 節點,必須附帶上對節點的查找
 51     屬性必需要加[]
 52 */
 53 --選取屬於 root 子元素的第一個 rogue 元素。
 54 SELECT @x.query('/root/rogue[1]')
 55 --選取屬於 root 子元素的最後一個 rogue 元素。
 56 SELECT @x.query('/root/rogue[last()]')
 57 --選取屬於 root 子元素的倒數第二個 rogue 元素。
 58 SELECT @x.query('/root/rogue[last()-1]')
 59 --選取最前面的兩個屬於 root 元素的子元素的 rogue 元素。
 60 SELECT @x.query('/root/rogue[position()<3]')
 61 --選取 root 元素的全部 hobo 元素,且其中的屬性 id 的值須大於 1。
 62 SELECT @x.query('/root//hobo[@id>1]')
 63 ----擴展: root 元素的全部 hobo 元素,且其中的屬性 id 的值須大於 1 而且子節點 name 的值爲 光輝 的。
 64 SELECT @x.query('/root/rogue[./hobo[@id>1 and name="光輝"]]')
 65 --選取 root 子元素的全部 rogue 元素,且 屬性id 的值須大於 爲001 子元素hobo 屬性 id 的值爲 1的
 66 SELECT @x.query('/root/rogue[@id="001" and ./hobo[@id=1]]')
 67 --if then else 表達式  
 68 SELECT @x.query('
 69 if ( 1=2 ) then
 70   /root/rogue[@id="001"]
 71 else
 72   /root/rogue[@id="002"]
 73 ')
 74 
 75 --路徑表達式步驟中的謂詞 
 76 SELECT @x.query('/root/rogue[1]/hobo/name')--選擇第一個 /root/rogue 節點下的全部 <Name> 元素。
 77 SELECT @x.query('/root/rogue/hobo[1]/name')--選擇 /root/rogue/hobo 節點下的全部 <Name> 元素。
 78 SELECT @x.query('/root/rogue/hobo/name[1]')--選擇 /root/rogue/hobo 節點下的全部第一個 <Name> 元素。
 79 SELECT @x.query('(/root/rogue/hobo/name)[1]')--選擇 /root/rogue/hobo 節點下的第一個 <Name> 元素。
 80 --使用聚合函數
 81 SELECT @x.query('count(/root/rogue/hobo/name)'),@x.query('count(/root/rogue/hobo/name[1])')
 82  --FLWOR 迭代語法。FLWOR 是 for、let、where、order by 和 return 的縮寫詞。
 83 --1
 84 SELECT @x.query('
 85 <result>
 86  { for $i in /root/rogue/hobo/name[1]
 87     return string($i)
 88  }
 89 </result>')
 90 --2
 91 SELECT @x.query('
 92    for $Loc in /root/rogue/hobo,
 93        $FirstStep in $Loc/name[1]
 94    return 
 95        string($FirstStep)
 96 ')
 97 --3
 98 SELECT @x.query('
 99    for $i in /root/rogue/hobo
100    order by $i/@id descending
101    return string($i/name[1])
102 ')
103 --4
104 SELECT @x.query('
105    for $i in /root/rogue/hobo
106    order by local-name($i) 
107    return string($i/name[1])
108 ')
相關文章
相關標籤/搜索