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

Bagaimana cara meneruskan variabel yang berisi daftar ke kueri SQL dinamis?

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 dari exec ?

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 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:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara memuat gambar dari SQL Server ke dalam kotak gambar?

  2. Kebiasaan Buruk:Menghindari NULL di SQL Server

  3. Klausul Output SQL Server menjadi variabel skalar

  4. Cara Memperbaiki "Daftar pilih untuk pernyataan INSERT berisi lebih sedikit item daripada daftar sisipan"

  5. Bandingkan Kolom Di Mana Satu Mirip dengan Bagian Lain