SQL SERVER中的FOR XML PATH是一个用于将查询结果集转换为XML格式输出的子句,除了基础的XML生成能力之外,它还能实现很多实用的数据处理功能,比如多行数据拼接为单个字符串、自定义数据格式输出等,是SQL开发中非常实用的工具。

FOR XML PATH基础用法
FOR XML PATH的基本作用是将查询的每一行数据转换为XML元素,PATH后面可以指定XML元素的名称。如果不指定PATH的参数,默认会使用<row>作为元素名。
我们来看一个最基础的示例,先创建一张测试用的用户表并插入数据:
-- 创建测试表
CREATE TABLE TestUser (
UserId INT PRIMARY KEY,
UserName NVARCHAR(50),
UserAge INT
)
-- 插入测试数据
INSERT INTO TestUser VALUES (1, '张三', 20)
INSERT INTO TestUser VALUES (2, '李四', 22)
INSERT INTO TestUser VALUES (3, '王五', 25)
使用FOR XML PATH查询这张表的数据:
SELECT UserId, UserName, UserAge FROM TestUser FOR XML PATH
执行上述语句后,会得到如下的XML结果:
<row> <UserId>1</UserId> <UserName>张三</UserName> <UserAge>20</UserAge> </row> <row> <UserId>2</UserId> <UserName>李四</UserName> <UserAge>22</UserAge> </row> <row> <UserId>3</UserId> <UserName>王五</UserName> <UserAge>25</UserAge> </row>
用FOR XML PATH实现字符串拼接
字符串拼接是FOR XML PATH最常用的场景之一,我们可以将多行的某个字段值拼接成一个完整的字符串,还可以自定义分隔符。
比如我们要把TestUser表中的所有用户名拼接成一个用逗号分隔的字符串,实现代码如下:
SELECT STUFF((
SELECT ',' + UserName FROM TestUser FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)'), 1, 1, '') AS UserNameStr
这里用到了几个关键点:
- PATH('')表示不生成外层包裹的元素,直接输出内部的内容
- TYPE关键字会让结果以XML类型返回,避免特殊字符被转义
- value('.', 'NVARCHAR(MAX)')是把XML结果转换为字符串
- STUFF函数的作用是去掉拼接后字符串最前面的多余逗号
执行上述语句后,得到的结果就是张三,李四,王五。
结合条件实现分组拼接
FOR XML PATH还可以结合分组条件,实现按某个字段分组后拼接对应数据的能力。比如我们新增一张订单表,记录每个用户的订单信息:
CREATE TABLE TestOrder (
OrderId INT PRIMARY KEY,
UserId INT,
OrderName NVARCHAR(50)
)
INSERT INTO TestOrder VALUES (1, 1, '订单A')
INSERT INTO TestOrder VALUES (2, 1, '订单B')
INSERT INTO TestOrder VALUES (3, 2, '订单C')
INSERT INTO TestOrder VALUES (4, 3, '订单D')
INSERT INTO TestOrder VALUES (5, 3, '订单E')
现在要查询每个用户对应的所有订单名称,用逗号分隔,实现代码如下:
SELECT
u.UserId,
u.UserName,
STUFF((
SELECT ',' + o.OrderName FROM TestOrder o
WHERE o.UserId = u.UserId
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)'), 1, 1, '') AS OrderList
FROM TestUser u
执行后可以得到每个用户对应的订单列表,比如用户张三的OrderList就是订单A,订单B。
自定义XML输出格式
除了拼接字符串,FOR XML PATH还可以自定义XML的输出结构。比如我们要生成符合自定义格式的XML数据,用来对接其他系统:
SELECT
UserId AS 'User/Id',
UserName AS 'User/Name',
UserAge AS 'User/Age'
FROM TestUser
FOR XML PATH('UserInfo'), ROOT('UserList')
上述语句中,PATH('UserInfo')指定每一行数据的外层元素为<UserInfo>,ROOT('UserList')指定所有数据的最外层根元素为<UserList>,字段后面的路径表示嵌套的XML元素结构。执行后得到的结果如下:
<UserList>
<UserInfo>
<User>
<Id>1</Id>
<Name>张三</Name>
<Age>20</Age>
</User>
</UserInfo>
<UserInfo>
<User>
<Id>2</Id>
<Name>李四</Name>
<Age>22</Age>
</User>
</UserInfo>
<UserInfo>
<User>
<Id>3</Id>
<Name>王五</Name>
<Age>25</Age>
</User>
</UserInfo>
</UserList>
使用注意事项
在使用FOR XML PATH的时候,有一些细节需要注意:
- 如果拼接的字符串中包含XML特殊字符,比如<、>、&,一定要加上TYPE关键字,否则这些字符会被转义,导致拼接结果不符合预期
- 拼接的字符串长度如果超过NVARCHAR(4000),要使用NVARCHAR(MAX)作为转换类型,避免数据被截断
- 如果不需要生成XML格式,只是做字符串拼接,PATH的参数设置为空字符串即可,不需要指定元素名
通过上面的示例可以看出,FOR XML PATH的功能远不止生成XML,灵活运用它可以解决很多SQL开发中的数据处理难题,提升开发效率。
SQL_SERVERFOR_XML_PATH字符串拼接XML输出修改时间:2026-07-11 18:18:38