Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

argument de procédure stockée sql en tant que paramètre pour la requête dynamique

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é ?

  1. Toujours utiliser dbo préfixe lors de la création / référencement d'objets.
  2. 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.
  3. 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.
  4. @sql doit toujours être NVARCHAR .
  5. 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).
  6. 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).