使用 FOR XML 连接多行的值

FOR XML 函数的一个常见用途是连接多行的值。

以下是使用 Customers 表的示例 :

SELECT 
    STUFF( (SELECT ';' + Email
        FROM Customers 
        where (Email is not null and Email <> '')
        ORDER BY Email ASC 
        FOR XML PATH('')), 
    1, 1, '')

在上面的示例中,FOR XML PATH('')) 用于连接电子邮件地址,使用 ; 作为分隔符。此外,STUFF 的目的是从连接的字符串中删除前导 ;STUFF 也隐式地将连接的字符串从 XML 转换为 varchar。

注意:上面示例的结果将是 XML 编码的,这意味着它将用 &lt; 等替换 < 字符。如果你不想这样,请将 FOR XML PATH('')) 更改为 FOR XML PATH, TYPE).value('.[1]','varchar(MAX)'),例如:

SELECT 
    STUFF( (SELECT ';' + Email
        FROM Customers 
        where (Email is not null and Email <> '')
        ORDER BY Email ASC 
        FOR XML PATH, TYPE).value('.[1]','varchar(900)'),
    1, 1, '')

这可以用来实现类似于 MySQL 中的 GROUP_CONCAT 或 PostgreSQL 9.0+中的 string_agg 的结果,尽管我们使用子查询而不是 GROUP BY 聚合。 (作为替代方案,如果你正在寻找更接近 GROUP_CONCAT 的功能,你可以安装用户定义的聚合,例如聚合 )。