Seu sp_executesql SQL provavelmente deveria ser;
DECLARE @SQL as nvarchar(128) = 'select ' + @Columns + ' from ' +
@TableName + ' where [email protected]'
Isso permitirá que você chame sp_executesql com @eStatus como parâmetro em vez de incorporá-lo ao SQL. Isso dará a vantagem de que @eStatus pode conter quaisquer caracteres e ele será escapado automaticamente pelo banco de dados, se necessário para ser seguro.
Compare isso com o SQL necessário para EXEC;
DECLARE @SQL as nvarchar(128) = 'select ' + @Columns + ' from ' +
@TableName + ' where Status=' + char(39) + @Status + char(39)
...onde um char(39) embutido em @Status tornará seu SQL inválido e possivelmente criará uma possibilidade de injeção de SQL. Por exemplo, se @Status estiver definido como
O'Reilly
, seu SQL resultante seria; select acol,bcol,ccol FROM myTable WHERE Status='O'Reilly'