Gunakan FOR XML PATH untuk mencipta senarai dipisahkan koma dalam SQL Server
Contoh ini menunjukkan cara menggunakan FOR XML PATH
untuk membuat senarai yang dipisahkan koma daripada jadual:
<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>
Penjelasan terperinci:
Inti pertanyaan ini ialah bagaimana FOR XML PATH
mengendalikan XML sebenar. Pertimbangkan jadual pekerja yang dipermudahkan:
<code>EmployeeID Name 1 John Smith 2 Jane Doe</code>
FOR XML PATH
Tukar data kepada format XML. Jalankan pertanyaan berikut:
<code class="language-sql">SELECT EmployeeID, Name FROM emp.Employee FOR XML PATH ('Employee')</code>
akan menjana XML berikut:
<code class="language-xml"><employee><employeeid>1</employeeid><name>John Smith</name></employee><employee><employeeid>2</employeeid><name>Jane Doe</name></employee></code>
Mengabaikan elemen 'Pekerja' daripada klausa PATH mengalih keluar teg XML luaran. Pertanyaan yang diubah suai:
<code class="language-sql">SELECT Name FROM Employee FOR XML PATH ('')</code>
akan menjana:
<code class="language-xml"><name>John Smith</name><name>Jane Doe</name></code>
Dalam pertanyaan asal, alias lajur 'data()' mencetuskan ralat apabila cuba mencipta teg XML yang tidak sah. Untuk menyelesaikan masalah ini, subkueri berkorelasi menyembunyikan ralat, jalur label dan menjana teks biasa.
<code class="language-sql">SELECT Name AS [Data()] FROM Employee FOR XML PATH ('')</code>
Akhir sekali, REPLACE
menggantikan ruang dalam senarai dengan koma.
Pertanyaan yang dipertingkatkan:
Walau bagaimanapun, pertanyaan yang dipertingkatkan berikut adalah lebih baik:
<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>
Pertanyaan ini menggunakan STUFF
untuk mengalih keluar koma dan ruang pertama, mengelakkan ralat apabila nama mengandungi ruang. Mengeluarkan alias lajur menghalang teg XML daripada dibuat.
Nota lain:
Untuk melepaskan aksara XML khas, gunakan .value
dalam kombinasi dengan FOR 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>
Atas ialah kandungan terperinci Bagaimana untuk Membuat Senarai Terhad Koma dalam Pelayan SQL Menggunakan FOR XML PATH?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!