Sql server 用T-SQL查询XML字段
如何使用T-SQL查询XML数据中的多个节点,并将结果输出为单个逗号分隔的字符串 例如,我想在下面的XML中获得一个所有目的地名称的列表,看起来像“德国、法国、英国、意大利、西班牙、葡萄牙”Sql server 用T-SQL查询XML字段,sql-server,xml,tsql,Sql Server,Xml,Tsql,如何使用T-SQL查询XML数据中的多个节点,并将结果输出为单个逗号分隔的字符串 例如,我想在下面的XML中获得一个所有目的地名称的列表,看起来像“德国、法国、英国、意大利、西班牙、葡萄牙” 首先,要从源XML表中获取记录列表,需要使用.nodes函数(): 样本输出: | NAME | ------------- | Germany | | France | | UK | | Italy | | Spain | | Portugal | 从
首先,要从源XML表中获取记录列表,需要使用
.nodes
函数():
样本输出:
| NAME |
-------------
| Germany |
| France |
| UK |
| Italy |
| Spain |
| Portugal |
从这里开始,您希望将目标值连接到一个逗号分隔的列表中。不幸的是,T-SQL不直接支持这一点,因此您必须使用某种变通方法。如果使用多行处理源表,最简单的方法是技巧。在这个查询中,我使用一个名为Data
的源表,将XML拆分为单独的记录,然后对XML路径(“”)
交叉应用,以生成逗号分隔的行。最后,从结果中剥离最后的,
,以创建列表():
示例输出(请注意,我向测试数据添加了另一个XML片段,以生成更复杂的示例):
感谢您的详细回答和示例。我甚至不知道SQLFiddle的存在。
Countries = [xmlstring].value('/Holidays/Summer/Regions/Destinations/@Name', 'varchar')
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 |
;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
| ID | COLUMN_1 |
-----------------------------------------------
| 1 | Germany,France,UK,Italy,Spain,Portugal |
| 2 | USA,Australia,Brazil |