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
dbo
prefijo al crear / hacer referencia a objetos. - Los nombres de tablas y columnas son
NVARCHAR
y 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 ON
como protección contra la sobrecarga de la red y el posible envío de conjuntos de resultados erróneos al cliente. @sql
siempre debe serNVARCHAR
.- Utilice
QUOTENAME
alrededor 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).