I’m looking for an XQuery that will take:

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

And produce a recordset like:

Entityid    sometext
1           this is some textthis is some more text

Essentially, combining the values in the 'sometext' nodes while grouping by the entityid. I figured I might be able to accomplish this with loops, but wasn't sure if there was a better way, possibly with a join/group by

有帮助吗?

解决方案

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;

Result:

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

其他提示

You could also do that using a more XQuery-based solution, eg

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)

Thanks to Mikael for xml / extra scenario.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top