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

Cara menggabungkan variabel menjadi string SQL

Anda dapat mencapai ini (jika saya mengerti apa yang Anda coba lakukan) menggunakan SQL dinamis.

Triknya adalah Anda perlu membuat string yang berisi pernyataan SQL. Itu karena nama tabel harus ditentukan dalam teks SQL yang sebenarnya, saat Anda menjalankan pernyataan. Referensi tabel dan referensi kolom tidak dapat diberikan sebagai parameter, mereka harus muncul dalam teks SQL.

Jadi Anda dapat menggunakan sesuatu seperti pendekatan ini:

SET @stmt = 'INSERT INTO @tmpTbl1 SELECT ' + @KeyValue 
    + ' AS fld1 FROM tbl' + @KeyValue

EXEC (@stmt)

Pertama, kita membuat pernyataan SQL sebagai string. Diberikan @KeyValue dari 'Foo', itu akan membuat string yang berisi:

'INSERT INTO @tmpTbl1 SELECT Foo AS fld1 FROM tblFoo'

Pada titik ini, itu hanya sebuah string. Tapi kita bisa mengeksekusi isi string, sebagai pernyataan SQL dinamis, menggunakan EXECUTE (atau EXEC Ringkasnya).

sp_executesql sekolah lama procedure adalah alternatif dari EXEC, cara lain untuk mengeksekusi SQL dymamic, yang juga memungkinkan Anda untuk melewatkan parameter, daripada menetapkan semua nilai sebagai literal dalam teks pernyataan.

TINDAK LANJUT

EBarr menunjukkan (dengan benar dan penting) bahwa pendekatan ini rentan terhadap SQL Injection.

Pertimbangkan apa yang akan terjadi jika @KeyValue berisi string:

'1 AS foo; DROP TABLE students; -- '

String yang akan kita hasilkan sebagai pernyataan SQL adalah:

'INSERT INTO @tmpTbl1 SELECT 1 AS foo; DROP TABLE students; -- AS fld1 ...'

Saat kita MENGEKSEKUSI string itu sebagai pernyataan SQL:

INSERT INTO @tmpTbl1 SELECT 1 AS foo;
DROP TABLE students;
-- AS fld1 FROM tbl1 AS foo; DROP ...

Dan bukan hanya DROP TABLE yang bisa disuntikkan. SQL apa pun dapat disuntikkan, dan mungkin jauh lebih halus dan bahkan lebih jahat. (Serangan pertama dapat berupa upaya untuk mengambil informasi tentang tabel dan kolom, diikuti dengan upaya untuk mengambil data (alamat email, nomor akun, dll.)

Salah satu cara untuk mengatasi kerentanan ini adalah dengan memvalidasi konten @KeyValue, katakan itu harus hanya berisi karakter alfabet dan numerik (mis. ]%' . Jika karakter ilegal ditemukan, tolak nilainya, dan keluar tanpa menjalankan SQL apa pun.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Memisahkan nilai yang dipisahkan koma dalam kolom menjadi beberapa baris di Sql Server

  2. Jalankan SERVERPROPERTY() Terhadap Server Tertaut di SQL Server

  3. Ambil nama kolom dan jenis prosedur tersimpan?

  4. Perbaiki Error Msg 4151 "Tipe argumen pertama ke NULLIF tidak dapat menjadi konstanta NULL karena tipe argumen pertama harus diketahui" di SQL Server

  5. Memahami Pernyataan SQL Server ALTER TABLE ADD COLUMN