Cukup
EXECUTE ('select id from [dbo].[CSVToTable] ('''[email protected]+''')')
declare @listOfIDs varchar(1000);
Atau, mana cara yang lebih baik
SET @listOfIDs = '5, 6, 7, 8, 9, 15, 28, 31, 49, 51, 59, 61';
EXECUTE sp_executesql N'select id from [dbo].[CSVToTable] (@listOfIDs)',
N'@listOfIDs VARCHAR(1000)',
@listOfIDs;
- Mengapa saya mendapatkan kesalahan ini?
Karena Anda benar-benar melewatkan terlalu banyak parameter, lebih dari yang diperlukan, untuk memahami ini, jalankan kueri ini dan lihat apa yang sebenarnya Anda berikan ke fungsi Anda
SELECT 'select id from [dbo].[CSVToTable] ('[email protected]+')';
yang akan kembali (dan inilah yang sebenarnya Anda coba jalankan)
select id from [dbo].[CSVToTable] (5, 6, 7, 8, 9, 15, 28, 31, 49, 51, 59, 61)
alih-alih (yang Anda butuhkan)
SELECT 'select id from [dbo].[CSVToTable] ('''[email protected]+''')';
- Oke, tapi kenapa
sp_executesql
lebih baik dariexec
?
Cukup, EXEC
akan memaksa Anda untuk menggabungkan semua variabel Anda menjadi satu string, itu adalah hal terburuknya, dan itu membuat kode Anda sepenuhnya terbuka untuk injeksi SQL . Lihat Bad Habits to Kick : Using EXEC() instead of sp_executesql
, ini tidak berarti bahwa sp_executesql
100% aman, tetapi memungkinkan pernyataan diparameterisasi sementara EXEC()
jangan, karena itu lebih aman daripada EXEC
dalam hal injeksi SQL .
Terakhir, karena Anda memberi tag sql-server
dan Anda tidak menentukan versinya, saya sarankan Anda menggunakan SPLIT_STRING()
function (2016+) lebih dari milik Anda, dan jika Anda tidak memiliki versi 2016+, buat sendiri tanpa menggunakan WHILE
loop untuk mendapatkan kinerja yang lebih baik, karena WHILE
loop akan berjalan lambat, jadi Anda harus menghindarinya.
Contoh: