91 votes

SQL dynamique - EXEC(@SQL) versus 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

?

94voto

Mitch Wheat Points 169614

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 ".

21voto

DJ. Points 10596

Le gros 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.

5voto

Gan Points 1181

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 .

2voto

Ten98 Points 142

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 :@.

-2voto

Sara Points 27
  1. Déclarer la variable
  2. Définissez-le par votre commande et ajoutez des parties dynamiques comme l'utilisation des valeurs de paramètres de sp(ici @IsMonday et @IsTuesday sont des paramètres de sp).
  3. 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.com

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.

Powered by:

X