gpt4 book ai didi

sql-server - 使用 T-SQL 查询 XML 字段

转载 作者:数据小太阳 更新时间:2023-10-29 02:31:06 27 4
gpt4 key购买 nike

如何使用 T-SQL 查询 XML 数据中的多个节点并将结果输出为单个逗号分隔的字符串?

例如,我想在以下 XML 中获取所有目的地名称的列表,看起来像“德国、法国、英国、意大利、西类牙、葡萄牙”

    <Holidays>
<Summer>
<Regions>
<Destinations>
<Destination Name="Germany" />
<Destination Name="France" />
<Destination Name="UK" />
<Destination Name="Italy" />
<Destination Name="Spain" />
<Destination Name="Portugal" />
</Destinations>
<Regions>
</Summer>
</Holidays>

我正在尝试类似的东西:

Countries = [xmlstring].value('/Holidays/Summer/Regions/Destinations/@Name', 'varchar')   

最佳答案

首先,要从源 XML 表中获取记录列表,您需要使用 .nodes功能(DEMO):

select Destination.value('data(@Name)', 'varchar(50)') as name
from [xmlstring].nodes('/Holidays/Summer/Regions/Destinations/Destination')
D(Destination)

示例输出:

|      NAME |
-------------
| Germany |
| France |
| UK |
| Italy |
| Spain |
| Portugal |

从这里开始,您想将目标值连接到一个逗号分隔的列表中。不幸的是,T-SQL 不直接支持它,因此您必须使用某种变通方法。如果您正在使用包含多行的源表,最简单的方法是 FOR XML PATH('') 诡计。在此查询中,我使用名为 Data 的源表,并将 XML 拆分为单独的记录,然后我将其 CROSS APPLYFOR XML PATH('')生成以逗号分隔的行。最后,最后的,从结果中剥离以创建列表(DEMO):

;with Destinations as (
select id, name
from Data
cross apply (
select Destination.value('data(@Name)', 'varchar(50)') as name
from [xmlstring].nodes('/Holidays/Summer/Regions/Destinations/Destination') D(Destination)
) Destinations(Name)
)
select id, substring(NameList, 1, len(namelist) - 1)
from Destinations as parent
cross apply (
select name + ','
from Destinations as child
where parent.id = child.id
for xml path ('')
) DestList(NameList)
group by id, NameList

示例输出(请注意,我在测试数据中添加了另一个 XML 片段以生成更复杂的示例):

| ID |                               COLUMN_1 |
-----------------------------------------------
| 1 | Germany,France,UK,Italy,Spain,Portugal |
| 2 | USA,Australia,Brazil |

关于sql-server - 使用 T-SQL 查询 XML 字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15115232/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com