Her er et meget mere sikkert 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';
Hvad har jeg ændret?
- Brug altid
dbo
præfiks ved oprettelse/henvisning til objekter. - Tabel- og kolonnenavne er
NVARCHAR
og kan være længere end 150 tegn. Meget sikrere at tillade, at parametrene passer til et bord, som nogen kan tilføje i fremtiden. - Tilføjet
SET NOCOUNT ON
som en vagt mod netværksoverhead og potentielt afsendelse af fejlagtige resultatsæt til klienten. @sql
skal altid væreNVARCHAR
.- Brug
QUOTENAME
omkring enhedsnavne såsom tabeller eller kolonner for at hjælpe med at forhindre SQL-injektion og også for at beskytte sig mod dårligt valgte navne (f.eks. søgeord). - Brug korrekte parametre, hvor det er muligt (igen for at hjælpe med at forhindre SQL-injektion, men også for at undgå at skulle foretage alle former for escape-afgrænsere på strengparametre).