表 Table_A(Category, Name):
Category | Name AAA | Company1 AAA | Company2 AAA | Company3 BBB | Company4 BBB | Company5
期望輸出:
Category | Names AAA | Company1,Company2,Company3 BBB | Company4,Company5
SELECT
Category,
Names = STUFF((
SELECT ',' + Name
FROM Table_A
WHERE Category = A.Category
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
FROM Table_A AS A
GROUP BY Category;
PATH('') 移除預設 <row> 標籤。SELECT ',' + Name ... FOR XML PATH('') 產生 ,Company1,Company2,Company3 (前導逗號)。TYPE 指示回傳 XML 型別,避免實體編碼 (< 等)。start 位置起 length 字元,插入 replacement。STUFF(xml_result, 1, 1, ''):移除第 1 個字元 (前導逗號),插入空字串 → Company1,Company2,Company3。. 代表當前節點內容。SELECT STUFF('abcdefg', 1, 0, '1234'); -- 1234abcdefg (插入)
SELECT STUFF('abcdefg', 1, 1, '1234'); -- 1234bcdefg (替換第1字元)
SELECT STUFF('abcdefg', 2, 1, '1234'); -- a1234cdefg (替換第2字元)
SELECT STUFF('abcdefg', 2, 2, '1234'); -- a1234defg (替換第2-3字元)
-- 基礎表
CREATE TABLE Stu_Course (StuName VARCHAR(20), Course VARCHAR(20));
INSERT INTO Stu_Course VALUES ('張三','數學'),('張三','英文'),('李四','物理');
-- 查詢
SELECT StuName, Course FROM Stu_Course FOR XML PATH;
-- 輸出: 張三 數學 |
...
-- PATH('') 移除 row 標籤
SELECT StuName, Course FROM Stu_Course FOR XML PATH('');
-- 輸出: 張三 數學 張三 英文 ...
SELECT Category, STRING_AGG(Name, ',') WITHIN GROUP (ORDER BY Name) AS Names FROM Table_A GROUP BY Category;
WITHIN GROUP (ORDER BY ...) 控制串聯順序。STUFF + FOR XML PATH。Category) 應有索引。FOR XML PATH 在極大字串 (> 2GB) 會截斷,STRING_AGG 同受 NVARCHAR(MAX) 限制。STUFF + FOR XML PATH('') 是 SQL Server 2005~2016 串聯字串的標準模式,原理為「XML 序列化 → 移除前導分隔符」。SQL 2017+ 建議直接使用 STRING_AGG。掌握兩種寫法,依版本選擇最佳方案。