2012-07-22 44 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