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.