Saya yakin ada tiga kasus berbeda yang harus Anda khawatirkan:
- string (apa pun yang memerlukan tanda kutip):
'''' + replace(@string, '''', '''''') + ''''
- nama (apa pun yang tidak diperbolehkan tanda kutip):
quotename(@string)
- hal-hal yang tidak dapat dikutip:ini memerlukan daftar putih
Catatan :Semuanya dalam variabel string (char
, varchar
, nchar
, nvarchar
, dll.) yang berasal dari sumber yang dikontrol pengguna harus menggunakan salah satu metode di atas. Artinya, bahkan hal-hal yang Anda harapkan berupa angka akan dikutip jika disimpan dalam variabel string.
Untuk detail selengkapnya, lihat Microsoft Magazine (Tautan usang:19-10-2016) .
Berikut ini contoh menggunakan ketiga metode tersebut:
EXEC 'SELECT * FROM Employee WHERE Salary > ''' +
REPLACE(@salary, '''', '''''') + -- replacing quotes even for numeric data
''' ORDER BY ' + QUOTENAME(@sort_col) + ' ' + -- quoting a name
CASE @sort_dir WHEN 'DESC' THEN 'DESC' END -- whitelisting
Perhatikan juga bahwa dengan melakukan semua operasi string sebaris di EXEC
pernyataan tidak ada kekhawatiran dengan masalah pemotongan. Jika Anda menetapkan hasil antara ke variabel, Anda harus pastikan bahwa variabel cukup besar untuk menampung hasil. Jika Anda melakukan SET @result = QUOTENAME(@name)
anda harus mendefinisikan @result
untuk menampung setidaknya 258 (2 * 128 + 2) karakter. Jika Anda melakukan SET @result = REPLACE(@str, '''', '''''')
anda harus mendefinisikan @result
menjadi dua kali ukuran @str
(anggap setiap karakter dalam @str
bisa berupa kutipan). Dan tentu saja, variabel string yang menyimpan pernyataan SQL akhir harus cukup besar untuk menampung semua SQL statis ditambah semua variabel hasil.