sql >> Base de Datos >  >> RDS >> Sqlserver

argumento de procedimiento almacenado sql como parámetro para consulta dinámica

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

  1. Utilice siempre dbo prefijo al crear / hacer referencia a objetos.
  2. 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.
  3. 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.
  4. @sql siempre debe ser NVARCHAR .
  5. 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).
  6. 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).