Om du har flera kapslade IF-block kommer SQL Server att kunna lagra exekveringsplaner. Jag antar att IF:erna är enkla, t.ex. OM @Parameter1 INTE ÄR NULL
SchmitzITs svar är korrekt att SQL Server även kan lagra exekveringsvägar för Dynamic SQL. Detta är dock bara sant om sql är korrekt byggt och kört.
Med korrekt byggd menar jag att explicit deklarera parametrarna och skicka dem till sp_executesql. Till exempel
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
Som du kan se hårdkodar inte sqlcommand-texten de parametervärden som ska användas. De skickas separat i exec sp_executesql
Om du skriver dålig gammal dynamisk sqL
set @sqlcommand = N'Select Something from Table where Field1 = ' + @Param1 + ' AND Field2 = ' + @Param2
exec sp_executesql @sqlcommand
då kommer inte SQL Server att kunna lagra exekveringsplaner