首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

SQL Server 多行合併為單行:FOR XML PATH 實現資料行轉字串

     編輯:程式設計綜合問答

需求場景

兩表關聯 (AdminID),主表 `資源表`、明細表 `資源跟蹤表`。需導出:每筆主表記錄合併所有關聯明細 `Content` 為單一欄位。

解決方案:FOR XML PATH('')

SELECT 
    r.name,
    r.adminid,
    (SELECT t.Content 
     FROM 資源跟蹤表 t 
     WHERE t.adminid = r.adminid 
     FOR XML PATH(''), TYPE
    ).value('.', 'NVARCHAR(MAX)') AS Content
FROM 資源表 r;

關鍵點解析

  • FOR XML PATH(''):將查詢結果轉為 XML,空路徑表示**無標籤包裹**,直接拼接字串。
  • TYPE:回傳 `xml` 型別而非 `nvarchar`,避免特殊字元 (如 `&` `<` `>`) 被編碼。
  • .value('.', 'NVARCHAR(MAX)'):將 XML 型別轉回字串。
  • 子查詢關聯外部 `r.adminid` 實現分組拼接。

替代方案 (SQL Server 2017+)

SELECT 
    r.name,
    r.adminid,
    STRING_AGG(t.Content, '') AS Content
FROM 資源表 r
JOIN 資源跟蹤表 t ON t.adminid = r.adminid
GROUP BY r.name, r.adminid;

`STRING_AGG` 語法更簡潔、效能更佳,建議新版本優先使用。

注意事項

  • 明細排序需在子查詢加 `ORDER BY` (如 `ORDER BY t.id`)。
  • 超大字串可能超過 `NVARCHAR(MAX)` 2GB 限制,需分批處理。
  • 若明細含 `NULL`,`FOR XML` 會忽略,`STRING_AGG` 需 `COALESCE`。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved