Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Différence procédure stockée EXEC vs sp_executesql?

Votre sp_executesql SQL devrait probablement être ;

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

Cela vous permettra d'appeler sp_executesql avec @eStatus comme paramètre au lieu de l'intégrer dans le SQL. Cela donnera l'avantage que @eStatus peut contenir n'importe quel caractère et il sera correctement échappé automatiquement par la base de données si nécessaire pour être sécurisé.

Comparez cela au SQL requis pour EXEC;

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

... où un char(39) intégré dans @Status rendra votre SQL invalide et créera éventuellement une possibilité d'injection SQL. Par exemple, si @Status est défini sur O'Reilly , votre SQL résultant serait ;

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