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'