首頁 >資料庫 >mysql教程 >如何使用 FOR XML PATH 在 SQL Server 中建立逗號分隔清單?

如何使用 FOR XML PATH 在 SQL Server 中建立逗號分隔清單?

DDD
DDD原創
2025-01-18 10:27:10612瀏覽

How to Create Comma-Delimited Lists in SQL Server Using FOR XML PATH?

使用 FOR XML PATH 在 SQL Server 中建立逗號分隔清單

本範例示範如何使用 FOR XML PATH 從表格建立逗號分隔清單:

<code class="language-sql">SELECT 
    E1.deptno, 
    allemp = Replace ((SELECT E2.ename AS 'data()' 
                       FROM emp AS e2 
                       WHERE e1.deptno = e2.DEPTNO 
                       FOR xml PATH('')), ' ', ', ') 
 FROM EMP AS e1 
 GROUP BY DEPTNO; </code>

詳解:

此查詢的核心在於 FOR XML PATH 如何處理實際的 XML。考慮一個簡化的員工表:

<code>EmployeeID      Name
1               John Smith
2               Jane Doe</code>

FOR XML PATH 將資料轉換為 XML 格式。執行以下查詢:

<code class="language-sql">SELECT  EmployeeID, Name
FROM    emp.Employee
FOR XML PATH ('Employee')</code>

會產生以下 XML:

<code class="language-xml"><employee><employeeid>1</employeeid><name>John Smith</name></employee><employee><employeeid>2</employeeid><name>Jane Doe</name></employee></code>

從 PATH 子句中省略 'Employee' 元素會移除外部 XML 標籤。修改後的查詢:

<code class="language-sql">SELECT  Name
FROM    Employee
FOR XML PATH ('')</code>

會產生:

<code class="language-xml"><name>John Smith</name><name>Jane Doe</name></code>

在原始查詢中,列別名 'data()' 在嘗試建立無效 XML 標籤時會觸發錯誤。為了解決這個問題,相關的子查詢隱藏了錯誤,去除了標籤並產生了純文字。

<code class="language-sql">SELECT  Name AS [Data()]
FROM    Employee
FOR XML PATH ('')</code>

最後,REPLACE 將清單中的空格替換為逗號。

改進後的查詢:

然而,以下改進後的查詢較可取:

<code class="language-sql">SELECT  E1.deptno, 
        STUFF(( SELECT  ', ' + E2.ename 
                FROM    emp AS e2 
                WHERE   e1.deptno = e2.DEPTNO 
                FOR XML PATH('')
            ), 1, 2, '') 
FROM    EMP AS e1 
GROUP BY DEPTNO; </code>

此查詢使用 STUFF 刪除第一個逗號和空格,避免了名稱包含空格時的錯誤。省略列別名可防止建立 XML 標籤。

其他注意事項:

為了轉義特殊的 XML 字符,可以使用 .valueFOR XML PATH 結合使用:

<code class="language-sql">SELECT  E1.deptno, 
        STUFF(( SELECT  ', ' + E2.ename 
                FROM    emp AS e2 
                WHERE   e1.deptno = e2.DEPTNO 
                FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)'), 1, 2, '') 
FROM    EMP AS e1 
GROUP BY DEPTNO; </code>

以上是如何使用 FOR XML PATH 在 SQL Server 中建立逗號分隔清單?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn