Här är ett mycket säkrare alternativ:
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';
Vad ändrade jag?
- Använd alltid
dbo
prefix när du skapar / refererar till objekt. - Tabell- och kolumnnamn är
NVARCHAR
och kan vara längre än 150 tecken. Mycket säkrare att tillåta parametrarna att passa ett bord som någon kan lägga till i framtiden. - Lägg till
SET NOCOUNT ON
som ett skydd mot nätverkskostnader och eventuellt skicka felaktiga resultatuppsättningar till klienten. @sql
ska alltid varaNVARCHAR
.- Använd
QUOTENAME
runt entitetsnamn som tabeller eller kolumner för att motverka SQL-injektion och även för att skydda sig mot dåligt valda namn (t.ex. nyckelord). - Använd korrekta parametrar där det är möjligt (igen för att hjälpa till att motverka SQL-injektion men också för att undvika att behöva göra alla typer av escape-avgränsare på strängparametrar).