Sql server 用T-SQL查询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 | 从

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

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


首先,要从源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 |