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