首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> SQL Server 2005

SQL Server FOR XML PATH 完全指南:從 XML 生成到字串串聯實戰

     編輯:SQL Server 2005

前言

FOR XML PATH 是 SQL Server 2005 引入的強大功能,不僅能將查詢結果輸出為 XML 格式,更常被用於將多行資料串聯成單一字串(如逗號分隔的 ID 列表、JSON 片段等)。本文透過範例逐步解析其語法變化與實務應用。

基礎語法與節點控制

預設行節點:<row>

DECLARE @TempTable TABLE (UserID INT, UserName NVARCHAR(50))
INSERT @TempTable VALUES (1, 'a'), (2, 'b')

SELECT UserID, UserName FROM @TempTable FOR XML PATH
-- 結果:
-- 1a
-- 2b

自訂節點名稱:PATH('節點名')

SELECT UserID, UserName FROM @TempTable FOR XML PATH('lzy')
-- 結果:節點變為 ...

移除外層節點:PATH('')

SELECT UserID, UserName FROM @TempTable FOR XML PATH('')
-- 結果:直接輸出子元素,無外層包裹
-- 1a
-- 2b

進階應用:字串串聯與格式化

無欄位名稱時的行為

若 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('') 移除外層節點,是字串串聯的核心技巧。
  • 欄位別名決定 XML 元素名稱;無別名時直接輸出值。
  • 子查詢搭配 FOR XML PATH 可實現群組內字串聚合(SQL Server 2017+ 可改用 STRING_AGG)。
  • 注意特殊字元(如 <, >, &)會被自動實體化編碼,若需原始字元需後處理。

擴展應用場景

  1. 動態 SQL IN 列表產生:將 ID 串聯為 '1,2,3' 供動態 SQL 使用。
  2. 報表欄位動態組合:依條件組合顯示欄位清單。
  3. 簡易 JSON/XML 輸出:無需應用層序列化,直接在 T-SQL 產生結構化輸出。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved