sql server XML中value(),exists(),nodes()方法

/*------------------------------------------------------------------------------+ #| = : = : = : = : = : = : = : = : = : = : = : = : = : = : = : = : = : = : = : | #|{>/------------------------------------------------------------------------\<}| #|: | Author : 小愛 | #|: | Description: XQuery的 value() 方法、 exist() 方法 和 nodes() 方法 | #|: | SQL Version: 適用於 SQL 2005, SQL 2008 , SQL 2012 | #|: | Copyright : 轉載請註明出處。更多請訪問:http://blog.csdn.net/beirut | #|: | Create Date: 2012-11-22 | #|: | About Me : 一個菜鳥dba | #|{>\------------------------------------------------------------------------/<}| #| = : = : = : = : = : = : = : = : = : = : = : = : = : = : = : = : = : = : = : | #+-----------------------------------------------------------------------------*/   
/* T-SQL 支持用於查詢 XML 數據類型的 XQuery 語言的子集。 本章將分析XQuery的 value() 方法、 exist() 方法 和 nodes() 方法 */  
------------------------------value() 方法--------------------------------------  --value(XPath條件,數據類型):結果爲指定的標量值類型; XPath條件結果必須惟一 
  
  
DECLARE @x XML SET @x=' <root> <rogue id="001"> <hobo id="1"> <name>彪</name> <nickname>阿彪</nickname> <type>流氓</type> </hobo> </rogue> <rogue id="002"> <hobo id="2"> <name>光輝</name> <nickname>二輝</nickname> <type>流氓</type> </hobo> </rogue> <rogue id="001"> <hobo id="3"> <name>小德</name> <nickname>小D</nickname> <type>臭流氓</type> </hobo> </rogue> </root>'  
--value() 方法從 XML 中檢索 rogue 屬性值。而後將該值分配給 int 變量。 
  
SELECT @x.value('(/root/rogue/@id)[1]','int') --解析 hobo 中屬性 id 爲2 的全部元素值 
SELECT @x.value('(/root/rogue[2]/hobo/@id)[1]','int') , @x.value('(/root/rogue[2]/hobo/name)[1]','varchar(10)') , @x.value('(/root/rogue[2]/hobo/nickname)[1]','varchar(10)') , @x.value('(/root/rogue[2]/hobo/type)[1]','varchar(10)') ------------------------------exist() 方法--------------------------------------  --exist() 方法- 用來判斷 XQuery 表達式返回的結果是否爲空 
  
----判斷 hobo 中屬性 id 的值 是否爲空 
  
SELECT @x.exist('(/root/rogue/hobo/@id)[1]') --判斷指定節點值是否相等 
DECLARE @xml XML ='<root><name>a</name></root>'  
SELECT @xml.exist('(/root/name[text()[1]="a"])') --用 exist() 方法比較日期時,請注意下列事項:  --代碼 cast as xs:date? 用於將值轉換爲 xs:date 類型,以進行比較。  --@Somedate 屬性的值是非類型化的。比較時,此值將隱式轉換爲比較右側的類型(xs:date 類型)。  --能夠使用 xs:date() 構造函數,而不用 cast as xs:date()。 
DECLARE @a XML SET @a='<root Somedate = "2012-01-01Z"/>'  
SELECT @a.exist('/root[(@Somedate cast as xs:date?) eq xs:date("2012-01-01")]') --下面的示例與上一示例相似,不一樣之處在於它具備 <Somedate> 元素。 
SET @a = '<Somedate>2002-01-01Z</Somedate>'  
SELECT  @a.exist('/Somedate[(text()[1] cast as xs:date ?) = xs:date("2002-01-01") ]') DECLARE    @x1 XML SELECT @x1 = '<Employee Number="1001" Name="Jacob"/>'  
  
DECLARE @att VARCHAR(20) SELECT @att = 'Number'  
  
IF @x1.exist('/Employee/@*[local-name()=sql:variable("@att")]') = 1   
    SELECT 'Exists' AS Result ELSE  
    SELECT 'Does not exist' AS Result ------------------------------nodes() 方法--------------------------------------  --語法  --nodes (XQuery) as Table(Column) 將一個 XQuery 表達式拆分紅多行  --以便於拆分紅關係數據 
   
--將 rogue 節點拆分紅多行 
SELECT T.c.query('.') AS result FROM   @x.nodes('/root/rogue') T(c); --擴展 rogue 拆分紅數據行 
SELECT T.c.value('(@id)[1]','varchar(10)') AS id ,T.c.value('(./hobo/name)[1]','varchar(10)') AS name ,T.c.value('(./hobo/nickname)[1]','varchar(10)') AS nickname ,T.c.value('(./hobo/type)[1]','varchar(10)') AS type FROM   @x.nodes('/root/rogue') T(c); /********************************************************** * * value() 方法 nodes() 方法 exist() 方法的綜合應用 * **********************************************************/  
  
--1 像下面的腳本,結點下還會用結點的,就要用到 text() 
DECLARE @xml XML=N' <a/> <b>b<c>c</c></b>'; SELECT @xml.value('(/b)[1]', 'varchar(10)'), @xml.value('(/b/text())[1]', 'varchar(10)') --2 對錶中的 XML 數據進行解析, 節點下面有多個相同節點的 使用 CROSS APPLY 和 nodes() 方法解析 
IF OBJECT_ID('tempdb..[#tb]') IS NOT NULL DROP TABLE [#tb]   
CREATE TABLE [#tb]([id] INT,[name] XML) INSERT [#tb]   
SELECT 1,'<r><i>a</i><i>b</i></r>' UNION ALL   
SELECT 2,'<r><i>b</i></r>' UNION ALL   
SELECT 3,'<r><i>d</i></r>'   
SELECT T.c.query('.'), T.c.value('.', 'sysname') FROM [#tb] A CROSS APPLY A.name.nodes('/r/i') T(c) --3 利用xml 拆分字符串 
DECLARE @s VARCHAR(100)='1,2,3,4,5,6'  
SELECT t.c.value('.','int') AS col  from (SELECT CAST('<x>'+REPLACE(@s,',','</x><x>')+'</x>' AS XML ).query('.') AS name) AS a CROSS APPLY a.name.nodes('/x') T(c) --4 取任意屬性的屬性值,這裏引入了 sql:variable 
DECLARE @xml XML DECLARE @Price DECIMAL(18 , 2), @xmlPath VARCHAR(10)= 'Price2'  
SET @xml='<row ProductID="1" Price1="111.00" Price2="222.00" Price3="333.00" Price4="444.00" Price5="555.00" Price6="666.00" Price7="777.00"/>'  
SELECT  col.value('(@Price2)[1]' , 'varchar(80)') FROM    @xml.nodes('/row') data(col) SELECT  @xml.value('(/row/@*[local-name()=sql:variable( "@xmlPath")])[1]' , 'DECIMAL(18,2)') SELECT  col.value('(@Price2)[1]' , 'varchar(80)') FROM    @xml.nodes('/row') data(col) SELECT  col.value('(@*[local-name()=sql:variable("@xmlPath")])[1]' , 'varchar(80)') FROM    @xml.nodes('/row') data(col) --組合使用 
DECLARE    @x1 XML SELECT @x1 = ' <Employees Dept="IT"> <Employee Number="1001" Name="Jacob"/> <Employee Number="1002" Name="Bob" ReportsTo="Steve"/> </Employees>'  
  
DECLARE @pos INT  
SELECT @pos = 2  
  
SELECT  
    @x1.value('local-name( (/Employees/Employee[2]/@*[position()=sql:variable("@pos")])[1] )','VARCHAR(20)') AS AttName --5 使用 WITH XMLNAMESPACES 聲明前綴 以及 XQuery 函數 namespace-uri() 
DECLARE @xml XML SELECT @xml = ' <employee xmlns="http://schemas.microsoft.com/sqlserver/emp" xmlns:loc="http://schemas.microsoft.com/sqlserver/location" name="Jacob" position="CTO" loc:city="Ahmedabad" loc:state="Gujarat" loc:country="India" />'  
--下面表達式將返回其命名空間 URI 爲空的全部元素節點  --定義默認的命名空間 
SELECT x.value('local-name(.)', 'VARCHAR(20)') AS Attribute, x.value('.', 'VARCHAR(20)') AS Value FROM @xml.nodes('declare default element namespace "http://schemas.microsoft.com/sqlserver/emp"; /employee/@*[namespace-uri()=""]') a(x) --or 直接用通用符 
  
SELECT x.value('local-name(.)', 'VARCHAR(20)') AS Attribute, x.value('.', 'VARCHAR(20)') AS Value FROM @xml.nodes('/*/@*[namespace-uri()=""]') a(x) -- 使用 WITH XMLNAMESPACES 
;WITH XMLNAMESPACES( DEFAULT 'http://schemas.microsoft.com/sqlserver/emp' ) SELECT x.value('local-name(.)', 'VARCHAR(20)') AS Attribute, x.value('.', 'VARCHAR(20)') AS Value FROM @xml.nodes('/employee/@*[namespace-uri()=""]') a(x) --返回全部帶有前綴的節點 
;WITH XMLNAMESPACES( DEFAULT 'http://schemas.microsoft.com/sqlserver/emp' ) SELECT x.value('local-name(.)', 'VARCHAR(20)') AS Attribute, x.value('.', 'VARCHAR(20)') AS Value FROM @xml.nodes('/employee/@*[namespace-uri()="http://schemas.microsoft.com/sqlserver/location"]') a(x) --返回全部帶有前綴的節點個數統計 
;WITH XMLNAMESPACES( DEFAULT 'http://schemas.microsoft.com/sqlserver/emp' ) SELECT @xml.value('count(/employee/@*[namespace-uri()="http://schemas.microsoft.com/sqlserver/location"])', 'int') AS [count]  
  
--sql:column() 函數  --將普通數據列和 xml 數據列進行合併 
  
  
DECLARE @t TABLE (id INT , data XML) INSERT  INTO @t (id , data) SELECT  1 , '<root><name>二輝</name><type>流氓</type></root>'  
        UNION ALL  
        SELECT  2 , '<root><name>彪</name><type>流氓</type></root>'  
SELECT id , data=data.query('<root> <id>{sql:column("id")}</id> {/root/name} {/root/type} </root>') FROM    @t  
  
/* id data ----------- ---------------------------------------------------- 1 <root><id>1</id><name>二輝</name><type>流氓</type></root> 2 <root><id>2</id><name>彪</name><type>流氓</type></root> */  
  
--根據一個xml 變量 與表中的值進行關聯查詢 
  
DECLARE @tb TABLE (id INT) INSERT INTO @tb(id) SELECT 1 UNION ALL   
SELECT 2 UNION ALL   
SELECT 3  
  
declare @XmlData xml set  @XmlData = ' <root> <rogue><typeid>1</typeid><name>二輝</name><type>流氓</type></rogue> <rogue><typeid>2</typeid><name>彪</name><type>流氓</type></rogue> </root>'  
  
SELECT t.id AS id FROM @tb t CROSS APPLY @XmlData.nodes('/root/rogue/typeid[. = sql:column("id")]') a(x) --string-length() 函數 和 number() 函數  --提取長度爲5的數字 
DECLARE @t TABLE (CustomerID INT, CustomerAddress VARCHAR(50)) INSERT INTO @t(CustomerID, CustomerAddress) SELECT 1, '12 20 97TH STREET NEW GARDENS, NY 11415 APT 8P' UNION ALL  
    SELECT 2, '20-10 93RD STREET #8A VICTORIA NY 11106 19TH FLR' UNION ALL  
    SELECT 3, '290 BERKELEY STREET APT24D NYC, NY 10038' UNION ALL  
    SELECT 4, '351-250 345 STREET PANAMA BEACH 11414 APT4F' ;WITH cte AS ( SELECT CustomerID, CAST('<i>' +REPLACE(CustomerAddress, ' ', '</i><i>') + '</i>' AS XML).query('.') AS CustomerAddress FROM @t ) SELECT CustomerID, x.i.value('.', 'VARCHAR(10)') AS ZipCode FROM cte CROSS APPLY CustomerAddress.nodes('//i[string-length(.)=5][number()>0]') x(i) /* CustomerID ZipCode ----------- ---------- 1 11415 2 11106 3 10038 4 11414 */  
  
--使用 contains() 函數進行模糊查詢 
SELECT  a.x.value('name[1]' , 'varchar(10)') FROM    @x.nodes('/root/rogue/hobo') a (x) CROSS APPLY a.x.nodes('type[contains(.,"臭流氓")]') b (y) SELECT  t.c.query('.') FROM    @x.nodes('/root/rogue/hobo[./type[contains(.,"臭流氓")]]') t (c)

 

  1. /*------------------------------------------------------------------------------+   
  2. #| = : = : = : = : = : = : = : = : = : = : = : = : = : = : = : = : = : = : = :  |   
  3. #|{>/------------------------------------------------------------------------\<}|   
  4. #|: | Author     :    小愛                                                      |   
  5. #|: | Description:    XQuery的 value() 方法、 exist() 方法 和 nodes() 方法        |  
  6. #|: | SQL Version:    適用於 SQL 2005, SQL 2008 , SQL 2012                      |   
  7. #|: | Copyright  :    轉載請註明出處。更多請訪問:http://blog.csdn.net/beirut     |  
  8. #|: | Create Date:    2012-11-22                                                |  
  9. #|: | About Me   :    一個菜鳥dba                                               |  
  10. #|{>\------------------------------------------------------------------------/<}|   
  11. #| = : = : = : = : = : = : = : = : = : = : = : = : = : = : = : = : = : = : = :  |   
  12. #+-----------------------------------------------------------------------------*/   
  13. /*  
  14. T-SQL 支持用於查詢 XML 數據類型的 XQuery 語言的子集。  
  15. 本章將分析XQuery的 value() 方法、 exist() 方法 和 nodes() 方法  
  16. */  
  17. ------------------------------value() 方法--------------------------------------  
  18. --value(XPath條件,數據類型):結果爲指定的標量值類型; XPath條件結果必須惟一  
  19.   
  20.   
  21. DECLARE @x XML   
  22. SET @x='  
  23. <root>  
  24.   <rogue id="001">  
  25.     <hobo id="1">  
  26.       <name>彪</name>  
  27.       <nickname>阿彪</nickname>  
  28.       <type>流氓</type>  
  29.     </hobo>  
  30.   </rogue>  
  31.   <rogue id="002">  
  32.     <hobo id="2">  
  33.       <name>光輝</name>  
  34.       <nickname>二輝</nickname>  
  35.       <type>流氓</type>  
  36.     </hobo>  
  37.   </rogue>  
  38.   <rogue id="001">  
  39.     <hobo id="3">  
  40.       <name>小德</name>  
  41.       <nickname>小D</nickname>  
  42.       <type>臭流氓</type>  
  43.     </hobo>  
  44.   </rogue>  
  45. </root>'  
  46. --value() 方法從 XML 中檢索 rogue 屬性值。而後將該值分配給 int 變量。  
  47.   
  48. SELECT @x.value('(/root/rogue/@id)[1]','int')  
  49. --解析 hobo 中屬性 id 爲2 的全部元素值  
  50. SELECT @x.value('(/root/rogue[2]/hobo/@id)[1]','int')  
  51. , @x.value('(/root/rogue[2]/hobo/name)[1]','varchar(10)')  
  52. , @x.value('(/root/rogue[2]/hobo/nickname)[1]','varchar(10)')  
  53. , @x.value('(/root/rogue[2]/hobo/type)[1]','varchar(10)')  
  54.   
  55.   
  56.   
  57. ------------------------------exist() 方法--------------------------------------  
  58. --exist() 方法- 用來判斷 XQuery 表達式返回的結果是否爲空  
  59.   
  60. ----判斷 hobo 中屬性 id  的值 是否爲空  
  61.   
  62. SELECT @x.exist('(/root/rogue/hobo/@id)[1]')  
  63. --判斷指定節點值是否相等  
  64. DECLARE @xml XML ='<root><name>a</name></root>'  
  65. SELECT @xml.exist('(/root/name[text()[1]="a"])')  
  66.   
  67. --用 exist() 方法比較日期時,請注意下列事項:  
  68. --代碼 cast as xs:date? 用於將值轉換爲 xs:date 類型,以進行比較。  
  69. --@Somedate 屬性的值是非類型化的。比較時,此值將隱式轉換爲比較右側的類型(xs:date 類型)。  
  70. --能夠使用 xs:date() 構造函數,而不用 cast as xs:date()。  
  71. DECLARE @a XML  
  72. SET @a='<root Somedate = "2012-01-01Z"/>'  
  73. SELECT @a.exist('/root[(@Somedate cast as xs:date?) eq xs:date("2012-01-01")]')  
  74. --下面的示例與上一示例相似,不一樣之處在於它具備 <Somedate> 元素。  
  75. SET @a = '<Somedate>2002-01-01Z</Somedate>'  
  76. SELECT  @a.exist('/Somedate[(text()[1] cast as xs:date ?) = xs:date("2002-01-01") ]')  
  77.    
  78. DECLARE    @x1 XML  
  79. SELECT @x1 = '<Employee Number="1001" Name="Jacob"/>'  
  80.   
  81. DECLARE @att VARCHAR(20)  
  82. SELECT @att = 'Number'  
  83.   
  84. IF @x1.exist('/Employee/@*[local-name()=sql:variable("@att")]') = 1   
  85.     SELECT 'Exists' AS Result  
  86. ELSE  
  87.     SELECT 'Does not exist' AS Result  
  88.   
  89. ------------------------------nodes() 方法--------------------------------------  
  90. --語法   
  91. --nodes (XQuery) as Table(Column) 將一個 XQuery 表達式拆分紅多行  
  92. --以便於拆分紅關係數據  
  93.    
  94. --將 rogue 節點拆分紅多行  
  95. SELECT T.c.query('.'AS result  
  96. FROM   @x.nodes('/root/rogue') T(c);  
  97.   
  98. --擴展 rogue 拆分紅數據行  
  99. SELECT T.c.value('(@id)[1]','varchar(10)'AS id  
  100. ,T.c.value('(./hobo/name)[1]','varchar(10)'AS name  
  101. ,T.c.value('(./hobo/nickname)[1]','varchar(10)'AS nickname  
  102. ,T.c.value('(./hobo/type)[1]','varchar(10)'AS type  
  103. FROM   @x.nodes('/root/rogue') T(c);  
  104.   
  105. /**********************************************************  
  106. *  
  107. * value() 方法 nodes() 方法 exist() 方法的綜合應用  
  108. *  
  109. **********************************************************/  
  110.   
  111. --1 像下面的腳本,結點下還會用結點的,就要用到 text()  
  112. DECLARE @xml XML=N'   
  113. <a/>   
  114. <b>b<c>c</c></b>';  
  115. SELECT @xml.value('(/b)[1]''varchar(10)'), @xml.value('(/b/text())[1]''varchar(10)')  
  116.   
  117. --2 對錶中的 XML 數據進行解析, 節點下面有多個相同節點的 使用 CROSS APPLY 和 nodes() 方法解析  
  118. IF OBJECT_ID('tempdb..[#tb]'IS NOT NULL DROP TABLE [#tb]   
  119. CREATE TABLE [#tb]([id] INT,[name] XML)   
  120. INSERT [#tb]   
  121. SELECT 1,'<r><i>a</i><i>b</i></r>' UNION ALL   
  122. SELECT 2,'<r><i>b</i></r>' UNION ALL   
  123. SELECT 3,'<r><i>d</i></r>'   
  124. SELECT   
  125.         T.c.query('.'),   
  126.         T.c.value('.''sysname')   
  127. FROM [#tb] A   
  128.         CROSS APPLY A.name.nodes('/r/i') T(c)  
  129.           
  130. --3 利用xml 拆分字符串  
  131. DECLARE @s VARCHAR(100)='1,2,3,4,5,6'  
  132. SELECT t.c.value('.','int'AS col  from    
  133. (SELECT CAST('<x>'+REPLACE(@s,',','</x><x>')+'</x>' AS XML ).query('.'AS nameAS a  
  134. CROSS APPLY a.name.nodes('/x') T(c)  
  135.   
  136.   
  137. --4 取任意屬性的屬性值,這裏引入了 sql:variable  
  138. DECLARE @xml XML  
  139. DECLARE @Price DECIMAL(18 , 2),   
  140.         @xmlPath VARCHAR(10)= 'Price2'  
  141. SET @xml='<row ProductID="1" Price1="111.00" Price2="222.00" Price3="333.00" Price4="444.00" Price5="555.00" Price6="666.00" Price7="777.00"/>'  
  142. SELECT  col.value('(@Price2)[1]' , 'varchar(80)')  
  143. FROM    @xml.nodes('/row') data(col)  
  144.   
  145. SELECT  @xml.value('(/row/@*[local-name()=sql:variable( "@xmlPath")])[1]' , 'DECIMAL(18,2)')   
  146.   
  147. SELECT  col.value('(@Price2)[1]' , 'varchar(80)')  
  148. FROM    @xml.nodes('/row') data(col)  
  149.   
  150. SELECT  col.value('(@*[local-name()=sql:variable("@xmlPath")])[1]' , 'varchar(80)')  
  151. FROM    @xml.nodes('/row') data(col)  
  152. --組合使用  
  153. DECLARE    @x1 XML  
  154. SELECT @x1 = '  
  155. <Employees Dept="IT">  
  156.   <Employee Number="1001" Name="Jacob"/>  
  157.   <Employee Number="1002" Name="Bob" ReportsTo="Steve"/>  
  158. </Employees>'  
  159.   
  160. DECLARE @pos INT  
  161. SELECT @pos = 2  
  162.   
  163. SELECT  
  164.     @x1.value('local-name(  
  165.         (/Employees/Employee[2]/@*[position()=sql:variable("@pos")])[1]  
  166.     )','VARCHAR(20)') AS AttName  
  167.       
  168.   
  169. --5 使用 WITH XMLNAMESPACES  聲明前綴 以及 XQuery 函數 namespace-uri()   
  170. DECLARE @xml XML  
  171. SELECT @xml = '  
  172. <employee  
  173. xmlns="http://schemas.microsoft.com/sqlserver/emp"  
  174. xmlns:loc="http://schemas.microsoft.com/sqlserver/location"  
  175. name="Jacob" position="CTO"  
  176. loc:city="Ahmedabad" loc:state="Gujarat" loc:country="India"  
  177. />'  
  178. --下面表達式將返回其命名空間 URI 爲空的全部元素節點  
  179. --定義默認的命名空間  
  180. SELECT  
  181. x.value('local-name(.)''VARCHAR(20)'AS Attribute,  
  182. x.value('.''VARCHAR(20)'AS Value  
  183. FROM @xml.nodes('declare default element namespace "http://schemas.microsoft.com/sqlserver/emp";   
  184. /employee/@*[namespace-uri()=""]') a(x)  
  185. --or  直接用通用符  
  186.   
  187. SELECT  
  188. x.value('local-name(.)''VARCHAR(20)'AS Attribute,  
  189. x.value('.''VARCHAR(20)'AS Value  
  190. FROM @xml.nodes('/*/@*[namespace-uri()=""]') a(x)  
  191.   
  192. -- 使用 WITH XMLNAMESPACES  
  193. ;WITH XMLNAMESPACES(  
  194. DEFAULT 'http://schemas.microsoft.com/sqlserver/emp'  
  195. )  
  196. SELECT  
  197. x.value('local-name(.)''VARCHAR(20)'AS Attribute,  
  198. x.value('.''VARCHAR(20)'AS Value  
  199. FROM @xml.nodes('/employee/@*[namespace-uri()=""]') a(x)  
  200.   
  201. --返回全部帶有前綴的節點  
  202. ;WITH XMLNAMESPACES(  
  203. DEFAULT 'http://schemas.microsoft.com/sqlserver/emp'  
  204. )  
  205. SELECT  
  206. x.value('local-name(.)''VARCHAR(20)'AS Attribute,  
  207. x.value('.''VARCHAR(20)'AS Value  
  208. FROM @xml.nodes('/employee/@*[namespace-uri()="http://schemas.microsoft.com/sqlserver/location"]') a(x)  
  209.   
  210. --返回全部帶有前綴的節點個數統計  
  211. ;WITH XMLNAMESPACES(  
  212. DEFAULT 'http://schemas.microsoft.com/sqlserver/emp'  
  213. )  
  214. SELECT @xml.value('count(/employee/@*[namespace-uri()="http://schemas.microsoft.com/sqlserver/location"])''int'AS [count]  
  215.   
  216. --sql:column() 函數  
  217. --將普通數據列和 xml 數據列進行合併  
  218.   
  219.   
  220. DECLARE @t TABLE (id INT , data XML)  
  221.    
  222. INSERT  INTO @t (id , data)  
  223.         SELECT  1 , '<root><name>二輝</name><type>流氓</type></root>'  
  224.         UNION ALL  
  225.         SELECT  2 , '<root><name>彪</name><type>流氓</type></root>'  
  226. SELECT  id ,   
  227. data=data.query('<root>  
  228.     <id>{sql:column("id")}</id>  
  229.     {/root/name}  
  230.     {/root/type}  
  231.     </root>')  
  232. FROM    @t  
  233.   
  234. /*  
  235.   
  236. id          data  
  237. ----------- ----------------------------------------------------  
  238. 1   <root><id>1</id><name>二輝</name><type>流氓</type></root>  
  239. 2   <root><id>2</id><name>彪</name><type>流氓</type></root>  
  240.   
  241. */  
  242.   
  243. --根據一個xml 變量 與表中的值進行關聯查詢  
  244.   
  245. DECLARE @tb TABLE (id INT)  
  246. INSERT INTO @tb(id)   
  247. SELECT 1 UNION ALL   
  248. SELECT 2 UNION ALL   
  249. SELECT 3  
  250.   
  251. declare @XmlData xml   
  252. set  @XmlData = '  
  253. <root>  
  254. <rogue><typeid>1</typeid><name>二輝</name><type>流氓</type></rogue>  
  255. <rogue><typeid>2</typeid><name>彪</name><type>流氓</type></rogue>  
  256. </root>'  
  257.   
  258. SELECT t.id AS id  
  259. FROM @tb t  
  260. CROSS APPLY @XmlData.nodes('/root/rogue/typeid[. = sql:column("id")]') a(x)  
  261.   
  262.   
  263.   
  264. --string-length() 函數 和 number() 函數  
  265. --提取長度爲5的數字  
  266. DECLARE @t TABLE (CustomerID INT, CustomerAddress VARCHAR(50))  
  267. INSERT INTO @t(CustomerID, CustomerAddress)   
  268.     SELECT 1, '12 20 97TH STREET NEW GARDENS, NY  11415  APT 8P' UNION ALL  
  269.     SELECT 2, '20-10 93RD STREET #8A VICTORIA NY 11106 19TH FLR' UNION ALL  
  270.     SELECT 3, '290 BERKELEY STREET APT24D  NYC, NY  10038' UNION ALL  
  271.     SELECT 4, '351-250  345 STREET PANAMA BEACH 11414  APT4F'  
  272.       
  273. ;WITH cte AS (  
  274.     SELECT   
  275.         CustomerID,  
  276.         CAST('<i>' +REPLACE(CustomerAddress, ' ''</i><i>') + '</i>' AS XML).query('.'AS CustomerAddress  
  277.     FROM @t  
  278. )  
  279. SELECT   
  280.     CustomerID,  
  281.     x.i.value('.''VARCHAR(10)'AS ZipCode  
  282. FROM cte  
  283. CROSS APPLY CustomerAddress.nodes('//i[string-length(.)=5][number()>0]') x(i)  
  284.       
  285. /*  
  286. CustomerID  ZipCode  
  287. ----------- ----------  
  288. 1           11415  
  289. 2           11106  
  290. 3           10038  
  291. 4           11414  
  292. */  
  293.   
  294. --使用 contains() 函數進行模糊查詢  
  295. SELECT  a.x.value('name[1]' , 'varchar(10)')  
  296. FROM    @x.nodes('/root/rogue/hobo') a (x)  
  297. CROSS APPLY a.x.nodes('type[contains(.,"臭流氓")]') b (y)  
  298.   
  299. SELECT  t.c.query('.')  
  300. FROM    @x.nodes('/root/rogue/hobo[./type[contains(.,"臭流氓")]]') t (c)  
相關文章
相關標籤/搜索