Ето една много по-безопасна алтернатива:
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';
Какво промених?
- Винаги използвайте
dbo
префикс при създаване/препратка към обекти. - Имената на таблици и колони са
NVARCHAR
и може да е по-дълъг от 150 знака. Много по-безопасно е да се позволи на параметрите да поемат таблица, която някой може да добави в бъдеще. - Добавен
SET NOCOUNT ON
като защита срещу натоварване на мрежата и потенциално изпращане на грешни набори от резултати към клиента. @sql
винаги трябва да бъдеNVARCHAR
.- Използвайте
QUOTENAME
около имена на обекти като таблици или колони, за да се предотврати инжектирането на SQL и също така да се предпазят от неправилно избрани имена (напр. ключови думи). - Използвайте правилни параметри, когато е възможно (отново, за да предотвратите SQL инжектирането, но също така и за да избегнете необходимостта да правите всякакви видове екраниране на разделители на параметри на низ).