Dynamique SQL-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 un serveur SQL en utilisant

EXEC (@SQL)

versus

EXEC SP_EXECUTESQL @SQL

?

81
demandé sur Anup Kattel 2009-02-14 02:25:40

5 réponses

sp_executesql est plus susceptible de favoriser la réutilisation des plans de requête. Lors de l'utilisation de sp_executesql , les paramètres sont explicitement identifiés dans la signature d'appel. Cet excellent article décrit ce procédé .

La souvent cité référence pour de nombreux aspects de la dynamique sql est Erland Sommarskog doit se lire: " La Malédiction et la bénédiction de SQL Dynamique ".

86
répondu Mitch Wheat 2012-10-26 23:59:00

la grande chose à propos de SP_EXECUTESQL est qu'il vous permet de créer des requêtes paramétrées ce qui est très bon si vous vous souciez de L'injection SQL.

19
répondu DJ. 2009-02-13 23:28:17

Microsoft sp_executesql article recommande l'utilisation de sp_executesql au lieu de execute .

parce que cette procédure stockée prend en charge substitution de paramètre , sp_executesql est plus polyvalent qu'EXECUTE; et parce que sp_executesql génère des plans d'exécution qui sont plus susceptibles d'être réutilisé par SQL Server, sp_executesql est plus efficace que EXÉCUTER.

ainsi, le prélèvement: ne pas utiliser execute déclaration . Utilisez sp_executesql .

3
répondu Gan 2013-06-17 09:25:38

j'utiliserais toujours sp_executesql de nos jours, tout ce que c'est vraiment est un wrapper pour EXEC qui gère les paramètres et les variables.

cependant, N'oubliez pas L'OPTION recompiler lorsque vous réglez des requêtes sur de très grandes bases de données, en particulier lorsque vous avez des données couvrant plus d'une base de données et utilisez une contrainte pour limiter les numérisations d'index.

sauf si vous utilisez L'OPTION RECOMPILE, SQL server tentera de créer une exécution "one size fits all" planifiez votre requête, et lancera un balayage complet de l'index chaque fois qu'elle est lancée.

c'est beaucoup moins efficace qu'un seek, et signifie qu'il est potentiellement balayage indexes entiers qui sont contraints à des gammes que vous ne demandez même pas: @

2
répondu Ten98 2014-01-06 12:00:18
  1. déclarer la variable
  2. définissez - le par votre commande et ajoutez des parties dynamiques comme les valeurs des paramètres d'utilisation de sp(ici @IsMonday et @IsTuesday sont sp params)
  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)
    
-3
répondu Sara 2012-11-19 11:37:45