Oto znacznie bezpieczniejsza alternatywa:
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';
Co zmieniłem?
- Zawsze używaj
dbo
prefiks podczas tworzenia / odwoływania się do obiektów. - Nazwy tabel i kolumn to
NVARCHAR
i może być dłuższe niż 150 znaków. O wiele bezpieczniejsze jest umożliwienie parametrom dostosowania do tabeli, którą ktoś może dodać w przyszłości. - Dodano
SET NOCOUNT ON
jako ochrona przed obciążeniem sieci i potencjalnie wysyłaniem błędnych zestawów wyników do klienta. @sql
powinien zawsze mieć wartośćNVARCHAR
.- Użyj
QUOTENAME
wokół nazw jednostek, takich jak tabele lub kolumny, aby pomóc udaremnić wstrzykiwanie SQL, a także chronić przed źle dobranymi nazwami (np. słowa kluczowe). - Używaj właściwych parametrów tam, gdzie to możliwe (znowu, aby pomóc udaremnić wstrzykiwanie SQL, ale także uniknąć konieczności wykonywania wszelkiego rodzaju unikania ograniczników w parametrach ciągu).