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 à l'aide de
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 à l'aide de
EXEC (@SQL)
contre
EXEC SP_EXECUTESQL @SQL
?
Réponses:
sp_executesql
est plus susceptible de promouvoir la réutilisation du plan de requête. Lors de l'utilisation sp_executesql
, les paramètres sont explicitement identifiés dans la signature d'appel. Cet excellent article décrit ce processus .
La référence souvent citée pour de nombreux aspects de SQL dynamique est la lecture incontournable d'Erland Sommarskog: " The Curse and Blessings of Dynamic SQL ".
Le grand avantage de SP_EXECUTESQL est qu'il vous permet de créer des requêtes paramétrées, ce qui est très bien si vous vous souciez de l'injection SQL.
L' article de Microsoft Utilisation de sp_executesql recommande d'utiliser sp_executesql
au lieu de l' execute
instruction.
Étant donné que cette procédure stockée prend en charge la substitution de paramètres , sp_executesql est plus polyvalent que EXECUTE; et comme sp_executesql génère des plans d'exécution qui sont plus susceptibles d'être réutilisés par SQL Server, sp_executesql est plus efficace que EXECUTE.
Donc, à emporter: n'utilisez pas de execute
déclaration . Utilisez sp_executesql
.
sp_executesql
ne peut pas être utilisé pour remplacer execute
. Peut-être devrais-je mettre le point que j'essaie de souligner comme suit: utiliser sp_executesql
au lieu de execute
autant que possible .
J'utiliserais toujours sp_executesql ces jours-ci, tout ce que c'est vraiment est un wrapper pour EXEC qui gère les paramètres et les variables.
Cependant, n'oubliez pas OPTION RECOMPILE lors du réglage des requêtes sur des bases de données très volumineuses, en particulier lorsque vous avez des données réparties sur plusieurs bases de données et que vous utilisez une contrainte pour limiter les analyses d'index.
À moins que vous n'utilisiez OPTION RECOMPILE, le serveur SQL tentera de créer un plan d'exécution «taille unique» pour votre requête et exécutera une analyse complète de l'index à chaque exécution.
Ceci est beaucoup moins efficace qu'une recherche et signifie qu'il analyse potentiellement 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)
int
en SQL dynamique. Notez que @sql est déclaré comme varchar
ounvarchar