Procédure stockée EXEC vs sp_executesql différence?
J'ai écrit deux procédure stockée avec un sp_executesql
et d'autres n'ont pas sp_executesql
les deux sont en cours d'exécution correctement mêmes résultats, je n'ai pas quelle est la différence entre
EXEC (@SQL) vs EXEC sp_executesql @SQL, N'@eStatus de type varchar(12)',
@eStatus = @Status
et Comment EXEC(@SQL) est sujette à l'injection SQL et sp_executesql @SQL...... n'est-ce pas?
Ci-dessous la Procédure Stockée sans sp_executesql
ALTER proc USP_GetEmpByStatus
(
@Status varchar(12)
)
AS
BEGIN
DECLARE @TableName AS sysname = 'Employee'
Declare @Columns as sysname = '*'
DECLARE @SQL as nvarchar(128) = 'select ' + @Columns + ' from ' + @TableName + ' where Status=' + char(39) + @Status + char(39)
print (@SQL)
EXEC (@SQL)
END
EXEC USP_GetEmpByStatus 'Active'
Ci-dessous la procédure stockée avec sp_executesql
create proc USP_GetEmpByStatusWithSpExcute
(
@Status varchar(12)
)
AS
BEGIN
DECLARE @TableName AS sysname = 'JProCo.dbo.Employee'
Declare @Columns as sysname = '*'
DECLARE @SQL as nvarchar(128) = 'select ' + @Columns + ' from ' + @TableName + ' where Status=' + char(39) + @Status + char(39)
print @SQL
exec sp_executesql @SQL, N'@eStatus varchar(12)', @eStatus = @Status
END
EXEC USP_GetEmpByStatusWithSpExcute 'Active'
Vous devez vous connecter pour publier un commentaire.
Votre sp_executesql SQL devrait probablement être;
Cela vous permettra d'appeler sp_executesql avec @eStatus en tant que paramètre au lieu de l'intégrer dans le SQL. Qui vous donnera l'avantage que @eStatus peut contenir n'importe quel caractère et il va être échappées automatiquement par la base de données, si nécessaire, pour être sûr.
Contraste que le SQL nécessaire pour EXEC;
...où un char(39) incorporés dans @Statut feront de votre SQL invalide et éventuellement de créer une injection SQL possibilité. Par exemple, si @Statut est
O'Reilly
, votre SQL serait;'
?INSERT INTO myTable VALUES (@eStatus)
insérer la chaîne "test", tandis queINSERT INTO myTable VALUES ('@eStatus')
insérer la chaîne de caractères '@eStatus'.'
dans le premier exemple de code.En plus de l'utilisation, il y a quelques différences importantes:
sp_executesql
permet de faire des déclarations paramétrablePar conséquent, Il est plus sûr que
EXEC
en termes d'injection SQLsp_executesql
pouvez tirer parti de la mise en cache de requêtes.Le TSQL chaîne est créée une seule fois, après que chaque fois que la même requête est appelée avec
sp_executesql
, SQL Server extrait du plan de requête à partir du cache et le réutiliseTables temporaires créées dans
EXEC
ne pouvez pas utiliser la table temporaire de mécanisme de mise en cacheAvec
sp_executesql
, vous n'avez pas à construire votre requête comme ça. Vous pouvez déclarer comme ceci:De cette façon, si votre
@Status
valeur est à partir d'un utilisateur vous pouvez utiliser@eStatus
et ne pas avoir à s'inquiéter au sujet d'échapper à'
. sp_executesql vous donne la possibilité de mettre des variables dans votre requête dans la forme d'une chaîne, au lieu d'utiliser la concaténation. Si vous avez un souci en moins.La colonne et les variables de table sont toujours les mêmes, mais c'est moins susceptibles d'être directement à partir d'un utilisateur.
Avec Exec Vous ne pouvez pas avoir un place de titulaire dans votre instruction T-Sql chaîne.
sp_executesql
vous donne l'avantage d'avoir une place de titulaire et passer à la valeur réelle à runtime