2012-08-03 29 views
1

我正在尋找一個XQuery,將採取:的XQuery節點值與組結合通過邏輯

<root> 
    <entity> 
     <entityid>1</entityid> 
     <sometext>this is some text</sometext> 
    </entity> 
    <entity> 
     <entityid>1</entityid> 
     <sometext>this is some more text</sometext> 
    </entity> 
</root> 

而產生這樣的記錄:

Entityid sometext 
1   this is some textthis is some more text 

本質上,結合中值'sometext'節點,同時由entityid分組。我想我也許能循環來做到這一點,但不知道是否有更好的方法,可能與加入/組由

回答

1
declare @XML xml = 
'<root> 
    <entity> 
     <entityid>1</entityid> 
     <sometext>this is some text</sometext> 
    </entity> 
    <entity> 
     <entityid>1</entityid> 
     <sometext>this is some more text</sometext> 
    </entity> 
    <entity> 
     <entityid>2</entityid> 
     <sometext>Another entity</sometext> 
    </entity> 
</root>'; 

select T.entityid, 
     @XML.query('/root/entity[entityid = sql:column("T.entityid")]/sometext').value('.', 'nvarchar(max)') as sometext 
from (
    select distinct T.N.value('entityid[1]', 'int') as entityid 
    from @XML.nodes('/root/entity') as T(N) 
    ) as T; 

結果:

entityid sometext 
----------- ----------------------------------------- 
1   this is some textthis is some more text 
2   Another entity 
+1

感謝Mikael,效果很棒! – 2012-08-04 05:24:36

1

你也可以請使用更多基於XQuery的解決方案,例如

DECLARE @xml XML = '<root> 
    <entity> 
     <entityid>1</entityid> 
     <sometext>this is some text</sometext> 
    </entity> 
    <entity> 
     <entityid>1</entityid> 
     <sometext>this is some more text</sometext> 
    </entity> 
    <entity> 
     <entityid>2</entityid> 
     <sometext>Another entity</sometext> 
    </entity> 
</root>' 

select 
    x.c.value('@entityId', 'int') entityId, 
    x.c.value('.', 'varchar(max)') someText 
from 
    (
    select @xml.query('for $e in distinct-values(root/entity/entityid) 
return <m entityId = "{$e}">{data(root/entity[entityid = $e]/sometext)}</m>') 
    ) r(c) 
    cross apply r.c.nodes('m') x(c) 

感謝Mikael for xml/extra場景。