Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

SQL dynamique et optimisation des procédures stockées

Si vous avez plusieurs blocs IF imbriqués, SQL Server pourra stocker des plans d'exécution. Je suppose que les IF sont simples, par exemple. SI @Paramètre1 N'EST PAS NULL

La réponse de SchmitzIT est correcte que SQL Server peut également stocker les chemins d'exécution pour Dynamic SQL. Cependant, cela n'est vrai que si le sql est correctement construit et exécuté.

Par correctement construit, je veux dire déclarer explicitement les paramètres et les transmettre à sp_executesql. Par exemple

declare @Param1 nvarchar(255) = 'foo'
        ,@Param2 nvarchar(255) = 'bar'
        ,@sqlcommand nvarchar(max)
        ,@paramList nvarchar(max)

set @paramList = '@Param1 nvarchar(255), @Param2 nvarchar(255)'
set @sqlcommand = N'Select Something from Table where Field1 = @Param1 AND Field2 = @Param2'

exec sp_executesql @statement = @sqlcommand
                  ,@params = @paramList
                  ,@Param1 = @Param1
                  ,@Param2 = @Param2

Comme vous pouvez le voir, le texte de la commande sql ne code pas en dur les valeurs des paramètres à utiliser. Ils sont passés séparément dans l'exec sp_executesql

Si vous écrivez un mauvais vieux sqL dynamique

set @sqlcommand = N'Select Something from Table where Field1 = ' + @Param1  + ' AND Field2 = ' + @Param2

exec sp_executesql @sqlcommand

alors SQL Server ne pourra pas stocker les plans d'exécution