在SQL Server里,把多行某列的值拼成一条记录是很常见的需求。借助子查询与FOR XML PATH,我们可以用纯集合操作完成这件事,而不必借助游标或临时表循环。

什么是FOR XML PATH
FOR XML PATH是SQL Server提供的将查询结果输出为XML的语法。当把PATH设为空字符串时,行内每个列会变成XML节点文本;配合STUFF或直接使用分隔符,就能把多行合并成一列字符串。
基础示例:合并单列多行
假设有订单表Orders,结构如下:
| UserId | OrderNo |
|---|---|
| 1 | A001 |
| 1 | A002 |
| 2 | B001 |
我们想按用户把订单号用逗号连起来,可以写成:
SELECT
UserId,
STUFF(
(SELECT ',' + o2.OrderNo
FROM Orders o2
WHERE o2.UserId = o1.UserId
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)')
, 1, 1, '') AS OrderList
FROM Orders o1
GROUP BY UserId;
上面子查询里FOR XML PATH('')把同一用户的OrderNo变成类似,A001,A002的文本,外层STUFF去掉首个逗号。
在子查询中关联主表字段
子查询必须关联外层表字段才能实现按组分组合并。上面示例中o2.UserId = o1.UserId就是关联条件,这是合并逻辑正确性的关键。
处理特殊字符
如果数据里含有&、<等XML保留字,直接取文本会被转义。用TYPE再加value()方法可拿到原始值:
SELECT
UserId,
(SELECT ',' + o2.OrderNo
FROM Orders o2
WHERE o2.UserId = o1.UserId
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)') AS OrderList
FROM Orders o1
GROUP BY UserId;
小结
利用子查询加FOR XML PATH,可以用简短的T-SQL完成多列数据合并。注意使用TYPE与value避免字符转义问题,并在子查询中正确关联外层字段即可。
SQL_ServerFOR_XML_PATH子查询修改时间:2026-07-30 20:21:13