Aquí hay una alternativa mucho más segura:
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é cambié?
- Utilice siempre
dboprefijo al crear / hacer referencia a objetos. - Los nombres de tablas y columnas son
NVARCHARy puede tener más de 150 caracteres. Es mucho más seguro permitir que los parámetros se adapten a una tabla que alguien podría agregar en el futuro. - Se agregó
SET NOCOUNT ONcomo protección contra la sobrecarga de la red y el posible envío de conjuntos de resultados erróneos al cliente. @sqlsiempre debe serNVARCHAR.- Utilice
QUOTENAMEalrededor de nombres de entidades como tablas o columnas para ayudar a frustrar la inyección de SQL y también para protegerse contra nombres mal elegidos (por ejemplo, palabras clave). - Utilice los parámetros adecuados siempre que sea posible (nuevamente para ayudar a frustrar la inyección de SQL, pero también para evitar tener que hacer todo tipo de escapes de delimitadores en los parámetros de cadena).