2012-07-22 48 views
2

我在XML類型的列下面的XML(XML本身是無類型)XML來基於列的數據使用SQL +的XQuery

<wi> 
    <w wid="16"> 
    <p>28</p> 
    <p>72</p> 
    <p>125</p> 
    </w> 
    <w wid="19"> 
    <p>89</p> 
    </w> 
    <w wid="20"> 
    <p>11</p> 
    </w> 
    <w wid="21"> 
    <p>74</p> 
    </w> 
</wi> 

無法弄清楚如何使用,產生兩列SQL +的XQuery:

p w 
--- --- 
11 20 
28 16 
72 16 
74 21 
89 19 
125 16 

回答

2

用途:

declare @x xml = '<wi> 
    <w wid="16"> 
    <p>28</p> 
    <p>72</p> 
    <p>125</p> 
    </w> 
    <w wid="19"> 
    <p>89</p> 
    </w> 
    <w wid="20"> 
    <p>11</p> 
    </w> 
    <w wid="21"> 
    <p>74</p> 
    </w> 
</wi>' 

select * 
from 
(
    select t.c.value('.', 'int') p 
     , t.c.value('../@wid', 'int') w 
    from @x.nodes('//p') t(c) 
)t 
order by p, w 
+0

Простенькоисовкусом,благодарю – 2012-07-22 02:48:56

+0

@YuriyGettya,不客氣。 – 2012-07-22 02:51:32

+0

假設我向根節點添加了命名空間:,如何在value()調用中指定它?沒有語法我嘗試工作。 – 2012-09-09 01:44:10

2

或者使用cross apply另一種方法:

select * 
from 
(
    select a.b.value('.', 'int') p 
     , t.c.value('@wid', 'int') w 
    from @x.nodes('//w') t(c) 
    cross apply t.c.nodes('p') a(b) 
)t 
order by p, w 
+0

不會使用父軸「..」。此版本的+1。 – 2012-07-22 20:30:13

+0

@MikaelEriksson,謝謝。 – 2012-07-23 00:24:03

+0

@MikaelEriksson我會試試看,謝謝。 – 2012-07-23 21:29:16