使用table1中的xml连接table2 - 并将table2中的所有条目作为合并字符串返回

时间:2011-07-27 17:04:27

标签: sql-server xml

我在表geographyIdXml中有一个xml列table1

该列中的xml如下所示:

<args>
    <arg val="1" />
    <arg val="2" />
    miss a few..
    <arg val="99" />
    <arg val="100" />
</args>

每个val标记中的属性<arg/>引用geographies表中行的id列。

我想从table1返回几列,并返回与geographyIdXml字段相关的地理名称 - 在单行和单列中。

例如,如果这些是返回的列:

id, name, geographies 

数据看起来像:

1, 'My spectacular campaign', 'New York, Paris, Peckham'

我整个下午都试着让这个工作。

尝试

cross apply geographyIdXml.nodes('args/arg') as ids(id)
inner join core..tbl_geography g on g.id = ids.id.value('@val','int')

但是在xml中每个条目只返回一行

尝试以上并合并,但我无法让它发挥作用。

如果有人有任何想法,我会全力以赴。感谢。

------更新 - SQL示例---------

select r.*, coalesce(g.name + ', ','') as name
from campaignRun r
cross apply geographyIdXml.nodes('args/arg') as ids(id)
inner join geographies g on g.id = ids.id.value('@val','int')
where r.id = 1

我返回了十行 - 对于geographyIdXml字段中的每个节点都有一行 - 这是错误的。

我想要的是一行中包含所有地理区域的合并字段但不知何故,我需要使用geographies字段中的xml将campaignRun表加入到我的geographyIdXml表中。

感谢您提供的任何帮助

2 个答案:

答案 0 :(得分:1)

所以你要做的就是将所有地理名称加入一个名称(将它们连接在一起)。如果是这样,这个最近的SO问题应该给出一些想法:

Concatenate many rows into a single text string?

答案 1 :(得分:1)

开始另一个答案来做实际的SQL。

使用以下设置内容:

create table campaignrun (ID int, name varchar(50), geographyIDXml xml)

insert campaignrun
select 1, 'My Spectacular Campaign', '<args>
    <arg val="1" />
    <arg val="2" />
    <arg val="3" />
   </args>
'

create table geographies (ID int, name varchar(50))

insert geographies 
select 1, 'New York'
union select 2, 'Paris'
union select 3, 'Peckham'

这个脚本:

select 
    r.ID, 
    r.Name,
    Geographies = STUFF(
        (SELECT ', ' + name 
        FROM 
            geographyIdXml.nodes('args/arg') as ids(id)
            join geographies g on g.id = ids.id.value('@val','int')
        FOR XML PATH (''))
        ,1,2,'')
from campaignRun r

where r.id = 1

返回:

ID    Name                        Geographies
1     My Spectacular Campaign     New York, Paris, Peckham

FOR XML位是一种将字符串连接在一起的作弊方式。 STUFF是一种从字符串开头删除前两个字符(即“,”)的简单方法。