Quels sont les avantages et les inconvénients réels de l'exécution d'une commande SQL dynamique dans une procédure stockée dans SQL Server en utilisant
EXEC (@SQL)
contre
EXEC SP_EXECUTESQL @SQL
?
Quels sont les avantages et les inconvénients réels de l'exécution d'une commande SQL dynamique dans une procédure stockée dans SQL Server en utilisant
EXEC (@SQL)
contre
EXEC SP_EXECUTESQL @SQL
?
sp_executesql
est plus susceptible de favoriser la réutilisation du plan de requête. Lorsque l'on utilise sp_executesql
Les paramètres sont explicitement identifiés dans la signature d'appel. Cet excellent article décrit cela processus .
La référence souvent citée pour de nombreux aspects du sql dynamique est l'ouvrage incontournable d'Erland Sommarskog : " La malédiction et les bénédictions de Dynamic SQL ".
Microsoft Utilisation de sp_executesql recommande d'utiliser sp_executesql
au lieu de execute
déclaration.
Parce que cette procédure stockée supporte substitution de paramètres , sp_executesql est plus polyvalent que EXECUTE ; et parce que sp_executesql génère des plans d'exécution qui sont plus susceptibles d'être réutilisés par le serveur SQL, sp_executesql est plus efficace que EXECUTE.
Donc, ce qu'il faut retenir : Ne pas utiliser execute
déclaration . Utilisez sp_executesql
.
J'utiliserais toujours sp_executesql de nos jours, il s'agit en fait d'une enveloppe pour EXEC qui gère les paramètres et les variables.
Toutefois, n'oubliez pas l'OPTION RECOMPILE lorsque vous réglez des requêtes sur de très grandes bases de données, en particulier lorsque les données sont réparties sur plusieurs bases de données et que vous utilisez un CONSTRAINT pour limiter les analyses d'index.
À moins que vous n'utilisiez l'OPTION RECOMPILE, le serveur SQL tentera de créer un plan d'exécution "taille unique" pour votre requête, et exécutera un balayage complet de l'index à chaque fois qu'il sera exécuté.
C'est beaucoup moins efficace qu'une recherche, et cela signifie qu'il faut potentiellement scanner des index entiers qui sont contraints à des plages que vous n'interrogez même pas :@.
exécuter la commande
declare @sql varchar (100)
set @sql ='select * from #td1'
if (@IsMonday+@IsTuesday !='')
begin
set @sql= @sql+' where PickupDay in ('''+@IsMonday+''','''+@IsTuesday+''' )'
end
exec( @sql)
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.