使用 FOR XML 連線多行的值
FOR XML
函式的一個常見用途是連線多行的值。
以下是使用 Customers 表的示例 :
SELECT
STUFF( (SELECT ';' + Email
FROM Customers
where (Email is not null and Email <> '')
ORDER BY Email ASC
FOR XML PATH('')),
1, 1, '')
在上面的示例中,FOR XML PATH(''))
用於連線電子郵件地址,使用 ;
作為分隔符。此外,STUFF
的目的是從連線的字串中刪除前導 ;
。STUFF
也隱式地將連線的字串從 XML 轉換為 varchar。
注意:上面示例的結果將是 XML 編碼的,這意味著它將用 <
等替換 <
字元。如果你不想這樣,請將 FOR XML PATH(''))
更改為 FOR XML PATH, TYPE).value('.[1]','
varchar(MAX)')
,例如:
SELECT
STUFF( (SELECT ';' + Email
FROM Customers
where (Email is not null and Email <> '')
ORDER BY Email ASC
FOR XML PATH, TYPE).value('.[1]','varchar(900)'),
1, 1, '')
這可以用來實現類似於 MySQL 中的 GROUP_CONCAT
或 PostgreSQL 9.0+中的 string_agg
的結果,儘管我們使用子查詢而不是 GROUP BY 聚合。 (作為替代方案,如果你正在尋找更接近 GROUP_CONCAT
的功能,你可以安裝使用者定義的聚合,例如此聚合 )。