FOR XML PATH 是 SQL Server 2005 引入的強大功能,不僅能將查詢結果輸出為 XML 格式,更常被用於將多行資料串聯成單一字串(如逗號分隔的 ID 列表、JSON 片段等)。本文透過範例逐步解析其語法變化與實務應用。
DECLARE @TempTable TABLE (UserID INT, UserName NVARCHAR(50))
INSERT @TempTable VALUES (1, 'a'), (2, 'b')
SELECT UserID, UserName FROM @TempTable FOR XML PATH
-- 結果:
-- 1 a
-- 2 b |
SELECT UserID, UserName FROM @TempTable FOR XML PATH('lzy')
-- 結果:節點變為 ...
SELECT UserID, UserName FROM @TempTable FOR XML PATH('')
-- 結果:直接輸出子元素,無外層包裹
-- 1 a
-- 2 b
若 SELECT 列表使用運算式而無別名,結果會直接串聯成單一字串:
SELECT CAST(UserID AS VARCHAR) + '', UserName + '' FROM @TempTable FOR XML PATH('')
-- 結果:1a2b(無分隔符)
-- CSV 格式
SELECT CAST(UserID AS VARCHAR) + ',', UserName + ',' FROM @TempTable FOR XML PATH('')
-- 結果:1,a,2,b,
-- 類 JSON 格式
SELECT '{' + CAST(UserID AS VARCHAR) + ',', '"' + UserName + '"', '}' FROM @TempTable FOR XML PATH('')
-- 結果:{1,"a"}{2,"b"}
需求:依城市分組,將用戶名以逗號串聯。
DECLARE @T1 TABLE (UserID INT, UserName NVARCHAR(50), CityName NVARCHAR(50))
INSERT @T1 VALUES
(1,'a','上海'), (2,'b','北京'), (3,'c','上海'),
(4,'d','北京'), (5,'e','上海')
SELECT B.CityName,
LEFT(UserList, LEN(UserList)-1) AS Users -- 移除尾隨逗號
FROM (
SELECT CityName,
(SELECT UserName + ',' FROM @T1 WHERE CityName = A.CityName FOR XML PATH('')) AS UserList
FROM @T1 A
GROUP BY CityName
) B
-- 結果:
-- 北京 b,d
-- 上海 a,c,e
FOR XML PATH('') 移除外層節點,是字串串聯的核心技巧。FOR XML PATH 可實現群組內字串聚合(SQL Server 2017+ 可改用 STRING_AGG)。<, >, &)會被自動實體化編碼,若需原始字元需後處理。'1,2,3' 供動態 SQL 使用。