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

¿Diferencia de procedimiento almacenado EXEC vs sp_executesql?

Su sp_executesql SQL probablemente debería ser;

DECLARE @SQL as nvarchar(128) = 'select ' + @Columns + ' from ' + 
            @TableName + ' where [email protected]'

Esto le permitirá llamar a sp_executesql con @eStatus como parámetro en lugar de incrustarlo en el SQL. Eso le dará la ventaja de que @eStatus puede contener cualquier carácter y la base de datos la escapará automáticamente si es necesario para que sea segura.

Compare eso con el SQL requerido para EXEC;

DECLARE @SQL as nvarchar(128) = 'select ' + @Columns + ' from ' + 
            @TableName + ' where Status=' + char(39) + @Status + char(39)

...donde un char(39) incrustado en @Status invalidará su SQL y posiblemente creará una posibilidad de inyección de SQL. Por ejemplo, si @Status se establece en O'Reilly , su SQL resultante sería;

select acol,bcol,ccol FROM myTable WHERE Status='O'Reilly'