Apakah ada cara yang anggun untuk menangani melewati daftar id sebagai parameter ke prosedur tersimpan?
Misalnya, saya ingin departemen 1, 2, 5, 7, 20 dikembalikan oleh prosedur tersimpan saya. Di masa lalu, saya telah mengirimkan daftar id yang dibatasi koma, seperti kode di bawah ini, tetapi merasa sangat kotor melakukannya.
SQL Server 2005 adalah satu-satunya batasan saya yang berlaku.
create procedure getDepartments
@DepartmentIds varchar(max)
as
declare @Sql varchar(max)
select @Sql = 'select [Name] from Department where DepartmentId in (' + @DepartmentIds + ')'
exec(@Sql)
sql-server
tsql
stored-procedures
JasonS
sumber
sumber
Jawaban:
Erland Sommarskog telah mempertahankan jawaban otoritatif untuk pertanyaan ini selama 16 tahun terakhir: Array dan Daftar di SQL Server .
Setidaknya ada selusin cara untuk melewatkan array atau daftar ke kueri; masing-masing memiliki pro dan kontra yang unik.
Saya benar-benar tidak bisa merekomendasikan cukup untuk membaca artikel untuk belajar tentang pengorbanan di antara semua opsi ini.
sumber
Ya, solusi Anda saat ini rentan terhadap serangan injeksi SQL.
Solusi terbaik yang saya temukan adalah menggunakan fungsi yang membagi teks menjadi kata-kata (ada beberapa yang diposting di sini, atau Anda dapat menggunakan ini dari blog saya ) dan kemudian bergabung dengan itu ke meja Anda. Sesuatu seperti:
sumber
Salah satu metode yang mungkin ingin Anda pertimbangkan jika Anda akan bekerja dengan banyak nilai adalah dengan menuliskannya ke tabel sementara terlebih dahulu. Maka Anda tinggal bergabung seperti biasa.
Dengan cara ini, Anda hanya mengurai satu kali.
Ini paling mudah untuk menggunakan salah satu UDF 'Pisah', tetapi begitu banyak orang telah memposting contoh-contoh itu, saya pikir saya akan mengambil rute yang berbeda;)
Contoh ini akan membuat tabel sementara untuk Anda ikuti (#tmpDept) dan mengisinya dengan id departemen yang Anda lewati. Saya berasumsi Anda memisahkannya dengan koma, tetapi Anda dapat - tentu saja - mengubah untuk apa pun yang Anda inginkan.
Ini memungkinkan Anda untuk melewati satu id departemen, beberapa id dengan koma di antaranya, atau bahkan beberapa id dengan koma dan spasi di antara mereka.
Jadi jika Anda melakukan sesuatu seperti:
Anda akan melihat nama-nama semua ID departemen yang Anda lewati ...
Sekali lagi, ini dapat disederhanakan dengan menggunakan fungsi untuk mengisi tabel sementara ... Saya terutama melakukannya tanpa satu hanya untuk membunuh beberapa kebosanan :-P
- Kevin Fairchild
sumber
Anda bisa menggunakan XML.
Misalnya
Perintah sp_xml_preparedocument sudah ada di dalamnya .
Ini akan menghasilkan output:
yang memiliki semua (lebih?) yang Anda butuhkan.
sumber
Metode XML super cepat, jika Anda ingin menggunakan prosedur tersimpan dan meneruskan daftar ID Departemen yang dipisahkan koma:
Semua kredit diberikan ke Blog Guru Brad Schulz
sumber
Coba yang ini:
sangat sederhana.
sumber