Ini adalah alternatif yang jauh lebih aman:
ALTER PROCEDURE dbo.queryfunctions
@Tabname NVARCHAR(511),
@colname NVARCHAR(128),
@valuesname VARCHAR(150)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @sql NVARCHAR(MAX);
SET @sql = 'SELECT * FROM ' + @Tabname
+ ' WHERE ' + QUOTENAME(@colname) + ' = @v';
EXEC sp_executesql @sql, N'@v VARCHAR(150)', @valuesname;
END
GO
EXEC dbo.queryfunctions N'dbo.education', N'eduChildName', 'Revathi';
Apa yang saya ubah?
- Selalu gunakan
dbo
awalan saat membuat / mereferensikan objek. - Nama tabel dan kolom adalah
NVARCHAR
dan bisa lebih dari 150 karakter. Jauh lebih aman untuk mengizinkan parameter mengakomodasi tabel yang mungkin ditambahkan seseorang di masa mendatang. - Menambahkan
SET NOCOUNT ON
sebagai pelindung terhadap overhead jaringan dan berpotensi mengirimkan kumpulan hasil yang salah ke klien. @sql
harus selaluNVARCHAR
.- Gunakan
QUOTENAME
seputar nama entitas seperti tabel atau kolom untuk membantu menggagalkan injeksi SQL dan juga untuk mencegah nama yang dipilih dengan buruk (misalnya kata kunci). - Gunakan parameter yang tepat jika memungkinkan (sekali lagi untuk membantu menggagalkan injeksi SQL tetapi juga untuk menghindari keharusan melakukan segala macam pelepasan pembatas pada parameter string).