使用 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 编码的,这意味着它将用 < 等替换 < 字符。如果你不想这样,请将 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 的功能,你可以安装用户定义的聚合,例如此聚合 )。