Saya mencoba untuk memigrasi aplikasi berbasis MySQL ke Microsoft SQL Server 2005 (bukan karena pilihan, tapi itu hidup).
Dalam aplikasi asli, kami menggunakan hampir semua pernyataan yang sesuai dengan ANSI-SQL, dengan satu pengecualian signifikan - kami menggunakan group_concat
fungsi MySQL cukup sering.
group_concat
, omong-omong, apakah ini: diberi tabel, katakanlah, nama dan proyek karyawan ...
SELECT empName, projID FROM project_members;
pengembalian:
ANDY | A100
ANDY | B391
ANDY | X010
TOM | A100
TOM | A510
... dan inilah yang Anda dapatkan dengan group_concat:
SELECT
empName, group_concat(projID SEPARATOR ' / ')
FROM
project_members
GROUP BY
empName;
pengembalian:
ANDY | A100 / B391 / X010
TOM | A100 / A510
Jadi yang ingin saya ketahui adalah: Apakah mungkin untuk menulis, katakanlah, fungsi yang didefinisikan pengguna dalam SQL Server yang mengemulasi fungsionalitas group_concat
?
Saya hampir tidak punya pengalaman menggunakan UDF, prosedur tersimpan, atau semacamnya, langsung saja SQL, jadi tolong sesat di sisi terlalu banyak penjelasan :)
Jawaban:
Tidak ada cara NYATA yang mudah untuk melakukan ini. Banyak ide di luar sana.
Yang terbaik yang saya temukan :
Atau versi yang berfungsi dengan benar jika data mungkin berisi karakter seperti
<
sumber
Saya mungkin agak terlambat ke pesta tetapi metode ini bekerja untuk saya dan lebih mudah daripada metode COALESCE.
sumber
Mungkin sudah terlambat untuk mendapatkan manfaat sekarang, tetapi bukankah ini cara termudah untuk melakukan sesuatu?
sumber
SQL Server 2017 memperkenalkan fungsi agregat baru
STRING_AGG ( expression, separator)
.Elemen gabungan dapat dipesan dengan menambahkan
WITHIN GROUP (ORDER BY some_expression)
Untuk versi 2005-2016 saya biasanya menggunakan metode XML dalam jawaban yang diterima.
Namun ini bisa gagal dalam beberapa keadaan. mis. jika data yang akan digabungkan berisi
CHAR(29)
Anda lihatMetode yang lebih kuat yang dapat menangani semua karakter adalah dengan menggunakan agregat CLR. Namun menerapkan pemesanan pada elemen gabungan lebih sulit dengan pendekatan ini.
Metode penetapan ke variabel tidak dijamin dan harus dihindari dalam kode produksi.
sumber
Silahkan lihat di GROUP_CONCAT proyek pada Github, saya pikir saya tidak persis apa yang Anda cari:
sumber
GROUP_CONCAT(klascode,'(',name,')' ORDER BY klascode ASC SEPARATOR ', ')
Untuk menggabungkan semua nama manajer proyek dari proyek yang memiliki beberapa manajer proyek, tulis:
sumber
Dengan kode di bawah ini Anda harus mengatur PermissionLevel = Eksternal pada properti proyek Anda sebelum Anda menyebarkan, dan mengubah database untuk mempercayai kode eksternal (pastikan untuk membaca di tempat lain tentang risiko keamanan dan alternatif [seperti sertifikat]) dengan menjalankan "ALTER DATABASE database_name SET TERPERCAYA DIRI ".
Saya telah menguji ini menggunakan kueri yang terlihat seperti:
Dan hasil: A, B, C, D
sumber
Mencoba ini tetapi untuk keperluan saya di MS SQL Server 2005 berikut ini yang paling berguna, yang saya temukan di xaprb
@ Markus seperti yang Anda sebutkan itu adalah karakter ruang yang menyebabkan masalah bagi saya.
sumber
Tentang jawaban J Hardiman, bagaimana:
Omong-omong, apakah penggunaan "Nama Keluarga" salah ketik atau apakah saya tidak memahami konsep di sini?
Ngomong-ngomong, terima kasih banyak teman-teman cuz itu menyelamatkan saya cukup lama :)
sumber
Untuk rekan Google saya di luar sana, inilah solusi plug-and-play yang sangat sederhana yang bekerja untuk saya setelah berjuang dengan solusi yang lebih kompleks untuk sementara waktu:
Perhatikan bahwa saya harus mengonversi ID menjadi VARCHAR untuk menggabungkannya sebagai string. Jika Anda tidak harus melakukan itu, ini versi yang lebih sederhana:
Semua kredit untuk ini masuk ke sini: https://social.msdn.microsoft.com/Forums/sqlserver/en-US/9508abc2-46e7-4186-b57f-7f368374e084/replicating-groupconcat-function-of-mysql-in- sql-server? forum = transactsql
sumber