Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

argumento de procedimento armazenado sql como parâmetro para consulta dinâmica


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?
  1. Sempre use dbo prefixo ao criar / referenciar objetos.
  2. 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.
  3. Adicionado SET NOCOUNT ON como proteção contra sobrecarga de rede e envio de conjuntos de resultados errôneos para o cliente.
  4. @sql deve ser sempre NVARCHAR .
  5. 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).
  6. 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).