我在表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
表中。
感谢您提供的任何帮助
答案 0 :(得分:1)
所以你要做的就是将所有地理名称加入一个名称(将它们连接在一起)。如果是这样,这个最近的SO问题应该给出一些想法:
答案 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
是一种从字符串开头删除前两个字符(即“,”)的简单方法。