SQL Server中的FOR XML PATH('')功能可以将查询结果集转换为XML格式,通过指定空字符串作为PATH参数,能够将多行数据拼接成单个字符串,是实现行转列字符串拼接的高效方案。

FOR XML PATH('')基本语法
FOR XML PATH的基本使用格式如下,其中FOR XML PATH('')会将每行查询结果拼接为连续的字符串:
SELECT 字段名
FROM 表名
FOR XML PATH('')
这里的PATH('')表示生成的XML元素名称为空,因此不会添加额外的XML标签,直接输出拼接后的字符串内容。
基础行转列拼接示例
假设我们有一张Product表,存储了商品分类和商品名称,表结构和测试数据如下:
-- 创建测试表
CREATE TABLE Product (
CategoryId INT,
ProductName NVARCHAR(50)
)
-- 插入测试数据
INSERT INTO Product VALUES (1, '手机')
INSERT INTO Product VALUES (1, '平板')
INSERT INTO Product VALUES (1, '笔记本')
INSERT INTO Product VALUES (2, '电视')
INSERT INTO Product VALUES (2, '冰箱')
如果需要将CategoryId为1的所有商品名称拼接成一个字符串,使用FOR XML PATH('')的查询语句如下:
SELECT ProductName
FROM Product
WHERE CategoryId = 1
FOR XML PATH('')
执行上述语句后,会得到结果手机平板笔记本,所有商品名称直接拼接在一起,没有分隔符。
带分隔符的字符串拼接
实际场景中通常需要给拼接的字符串添加分隔符,比如用逗号分隔每个商品名称,只需要在查询字段中对内容进行处理即可:
SELECT ',' + ProductName
FROM Product
WHERE CategoryId = 1
FOR XML PATH('')
此时执行结果会是,手机,平板,笔记本,开头会多出一个逗号,我们可以通过STUFF函数去掉开头的多余分隔符:
SELECT STUFF(
(SELECT ',' + ProductName
FROM Product
WHERE CategoryId = 1
FOR XML PATH('')),
1, 1, '') AS ProductList
STUFF函数的作用是从第一个字符开始,删除1个字符,然后替换为空字符串,最终得到手机,平板,笔记本的正确结果。
分组行转列拼接
如果需要按照CategoryId分组,将每个分类下的商品名称分别拼接成字符串,可以结合GROUP BY和子查询实现:
SELECT
CategoryId,
STUFF(
(SELECT ',' + ProductName
FROM Product p2
WHERE p2.CategoryId = p1.CategoryId
FOR XML PATH('')),
1, 1, '') AS ProductList
FROM Product p1
GROUP BY CategoryId
执行上述语句后,会得到每个分类对应的商品拼接列表:
| CategoryId | ProductList |
|---|---|
| 1 | 手机,平板,笔记本 |
| 2 | 电视,冰箱 |
处理特殊字符
如果拼接的字符串中包含XML特殊字符,比如<、>、&,FOR XML PATH会自动对这些字符进行转义,我们可以通过TYPE和value方法还原原始字符:
SELECT STUFF(
(SELECT ',' + ProductName
FROM (VALUES ('手机'), ('平板<Pro>'), ('笔记本')) AS T(ProductName)
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'),
1, 1, '') AS ProductList
上述语句中,TYPE指定返回XML类型,再通过value方法将XML转换为字符串,避免特殊字符被转义,最终得到手机,平板<Pro>,笔记本的正确结果。
使用注意事项
- 拼接的字符串长度如果超过NVARCHAR(MAX)的限制,需要确认字段类型是否支持,避免截断。
- 子查询中的表别名需要和主查询区分,避免字段关联错误。
- 如果拼接的内容包含NULL值,NULL会被忽略,需要提前用
ISNULL函数处理NULL值。
FOR XML PATH('')是SQL Server中处理行转列字符串拼接的经典方案,兼容性好,性能稳定,适合大多数拼接场景使用。
SQL_ServerFOR_XML_PATH行转列字符串拼接修改时间:2026-07-23 23:24:40