Voici une alternative beaucoup plus sûre :
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';
Qu'est-ce que j'ai changé ?
- Toujours utiliser
dbo
préfixe lors de la création / référencement d'objets. - Les noms de table et de colonne sont
NVARCHAR
et peut comporter plus de 150 caractères. Beaucoup plus sûr d'autoriser les paramètres à s'adapter à une table que quelqu'un pourrait ajouter à l'avenir. - Ajout de
SET NOCOUNT ON
comme protection contre la surcharge du réseau et l'envoi potentiel d'ensembles de résultats erronés au client. @sql
doit toujours êtreNVARCHAR
.- Utilisez
QUOTENAME
autour des noms d'entités tels que des tables ou des colonnes pour aider à contrecarrer l'injection SQL et également pour se prémunir contre les noms mal choisis (par exemple, les mots clés). - Utilisez les paramètres appropriés dans la mesure du possible (encore une fois pour aider à contrecarrer l'injection SQL, mais aussi pour éviter d'avoir à faire toutes sortes d'échappements de délimiteurs sur les paramètres de chaîne).