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

sp_executesql dengan pernyataan 'IN'

Alasan tidak berfungsi adalah karena @P1 diperlakukan sebagai satu, nilai tunggal.

misalnya ketika @Code adalah X101,B202 maka kueri hanya dijalankan sebagai:SELECT * FROM Table WHERE RegionCode IN ('X101,B202')Jadi, ia mencari RegionCode dengan nilai yang terkandung dengan @P1. Bahkan saat Anda menyertakan tanda kutip tunggal, semua itu berarti nilai yang dicarinya di RegionCode diharapkan berisi tanda kutip tunggal tersebut.

Anda harus benar-benar menggabungkan variabel @Code ke dalam teks perintah sql @Cmd agar berfungsi seperti yang Anda pikirkan:

SET @Code = '''X101'',''B202'''
SET @Cmd = 'SELECT * FROM Table WHERE RegionCode IN (' + @Code + ')'
EXECUTE (@Cmd)

Jelas, ini hanya membuka Anda untuk injeksi SQL sehingga Anda harus sangat berhati-hati jika mengambil pendekatan ini untuk memastikan Anda menjaganya.

Ada cara alternatif untuk menangani situasi ini di mana Anda ingin meneruskan daftar nilai dinamis untuk dicari.

Lihat contoh di blog saya untuk 2 pendekatan yang dapat Anda gunakan dengan SQL Server 2005. Salah satunya melibatkan pengiriman daftar CSV dalam bentuk "Nilai1,Nilai2,Nilai3" yang kemudian Anda bagi menjadi variabel TABEL menggunakan fungsi yang ditentukan pengguna (ada banyak yang menyebutkan ini pendekatan jika Anda melakukan pencarian cepat di Google atau situs ini). Setelah dipisah, Anda kemudian bergabung dengan TABLE var ke kueri utama Anda. Pendekatan kedua adalah meneruskan gumpalan XML yang berisi nilai-nilai dan menggunakan fungsionalitas XML bawaan SQL Server. Kedua pendekatan ini ditunjukkan dengan metrik kinerja di tautan itu, dan tidak memerlukan SQL dinamis.

Jika Anda menggunakan SQL Server 2008, Parameter Nilai Tabel akan menjadi cara yang tepat - itulah pendekatan ke-3 yang saya tunjukkan di tautan yang memberikan hasil terbaik.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Rata-rata pergerakan jendela di server sql

  2. SQL Server - kurangnya GABUNG ALAMI / x GABUNG y MENGGUNAKAN (bidang)

  3. Pelanggaran Kunci Unik di SQL Server - Apakah aman untuk mengasumsikan Kesalahan 2627?

  4. salin tabel dengan data ke database lain di SQL Server 2008

  5. SQLServer vs StateServer untuk Kinerja Status Sesi ASP.NET