使用 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 編碼的,這意味著它將用 &lt; 等替換 < 字元。如果你不想這樣,請將 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 的功能,你可以安裝使用者定義的聚合,例如聚合 )。