Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Apa yang dilakukan kueri ini untuk membuat daftar SQL Server yang dibatasi koma?

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; 


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pernyataan pembaruan dinamis dengan nama kolom variabel

  2. Memantau Database dan Instance melalui Activity Monitor | Pemecahan Masalah Kinerja SQL Server -2

  3. MASUKKAN MASSAL dengan kolom identitas (kenaikan otomatis)

  4. Cara Mengubah Kolom dari Null menjadi Tidak Null di SQL Server

  5. Bagaimana Transaksi Implisit Bekerja di SQL Server