Aqui está uma alternativa muito mais 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';
O que eu mudei?
- Sempre use
dbo
prefixo ao criar / referenciar objetos. - Os nomes das tabelas e colunas são
NVARCHAR
e pode ter mais de 150 caracteres. Muito mais seguro permitir que os parâmetros acomodem uma tabela que alguém possa adicionar no futuro. - Adicionado
SET NOCOUNT ON
como proteção contra sobrecarga de rede e envio de conjuntos de resultados errôneos para o cliente. @sql
deve ser sempreNVARCHAR
.- Usar
QUOTENAME
em torno de nomes de entidades, como tabelas ou colunas, para ajudar a impedir a injeção de SQL e também para proteger contra nomes mal escolhidos (por exemplo, palavras-chave). - Use parâmetros adequados sempre que possível (novamente para ajudar a impedir a injeção de SQL, mas também para evitar ter que fazer todos os tipos de escape de delimitadores em parâmetros de string).