【发布时间】:2014-04-30 22:09:36
【问题描述】:
这比此处发布的问题更进一步:link。提出的解决方案效果很好,但现在我遇到了一个更难的情况,并且由于 SQL 不允许创建第三个嵌套 SELECT,因此不适用相同的解决方案。
现在的情况是dub 标签可以在每个location 中重复,每个dub 可能包含多个data 标签。
一个例子:
<locations>
<location>
<loc name="Country 1" id="1" />
<dubs>
<dub name="City 1">
<data year="1950" value="2.43" />
<data year="1955" value="2.55" />
</dub>
<dub name="City 2">
<data year="1950" value="5.67" />
<data year="1955" value="4.42" />
</dub>
</dubs>
</location>
<location>
<loc name="Country 2" id="2" />
<dubs>
<dub bane="City ABC">
<data year="1950" value="4.54" />
<data year="1955" value="42.15" />
</dub>
</dubs>
</location>
</locations>
我尝试做第三个嵌套的SELECT,但这是不允许的:
SQL Fiddle - Not Working
select T.Country as 'loc/@name',
T.ID as 'loc/@id',
(
select [City] as 'dub/@name',
(
select 1950 as 'dub/data/@year',
T.[1950] as 'dub/data/@value',
null,
1955 as 'dub/data/@year',
T.[1955] as 'dub/data/@value'
for xml path(''), type
) as dub
) as dubs
from YourTable as T
for xml path('location'), root('locations'), type
我修改了原始问题的解决方案并生成了以下查询,几乎可以正常工作: SQL Fiddle - Almost Working
select T.Country as 'loc/@name',
T.ID as 'loc/@id',
(
select [City] as 'dub/@name',
1950 as 'dub/data/@year',
T.[1950] as 'dub/data/@value',
null,
1955 as 'dub/data/@year',
T.[1955] as 'dub/data/@value'
for xml path(''), type
) as dubs
from YourTable as T
for xml path('location'), root('locations'), type
但是,您会看到 data 标记没有被分组到它的 dub 标记中 - 正在使用空白的 name 属性内容重新创建 dub 标记。
有什么帮助吗?
【问题讨论】:
标签: sql sql-server xml for-xml