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

Procedimento armazenado EXEC vs diferença sp_executesql?


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'