Cara paling sederhana untuk menjelaskannya adalah dengan melihat bagaimana FOR XML PATH
bekerja untuk XML yang sebenarnya. Bayangkan sebuah tabel sederhana Employee
:
EmployeeID Name
1 John Smith
2 Jane Doe
Anda dapat menggunakan
SELECT EmployeeID, Name
FROM emp.Employee
FOR XML PATH ('Employee')
Ini akan membuat XML sebagai berikut
<Employee>
<EmployeeID>1</EmployeeID>
<Name>John Smith</Name>
</Employee>
<Employee>
<EmployeeID>2</EmployeeID>
<Name>Jane Doe</Name>
</Employee>
Menghapus 'Karyawan' dari PATH
menghapus tag xml luar sehingga kueri ini:
SELECT Name
FROM Employee
FOR XML PATH ('')
Akan membuat
<Name>John Smith</Name>
<Name>Jane Doe</Name>
Apa yang Anda lakukan kemudian tidak ideal, nama kolom 'data()' memaksa kesalahan sql karena mencoba membuat tag xml yang bukan tag resmi, sehingga kesalahan berikut dibuat:
Nama kolom 'Data()' berisi pengenal XML yang tidak valid seperti yang dipersyaratkan oleh FOR XML; '('(0x0028) adalah karakter pertama yang salah.
Subquery yang berkorelasi menyembunyikan kesalahan ini dan hanya menghasilkan XML tanpa tag:
SELECT Name AS [Data()]
FROM Employee
FOR XML PATH ('')
membuat
John Smith Jane Doe
Anda kemudian mengganti spasi dengan koma, cukup jelas...
Jika saya jadi Anda, saya akan menyesuaikan kuerinya sedikit:
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;
Tidak memiliki alias kolom berarti tidak ada tag xml yang dibuat, dan menambahkan koma dalam kueri pemilihan berarti nama apa pun dengan spasi tidak akan menyebabkan kesalahan,STUFF
akan menghapus koma dan spasi pertama.
TAMBAHKAN
Untuk menguraikan apa yang dikatakan KM dalam komentar, karena ini tampaknya mendapatkan beberapa tampilan lagi, cara yang benar untuk keluar dari karakter XML adalah dengan menggunakan .value
sebagai berikut:
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;