複数のネストされた IF ブロックがある場合、SQL Server は実行プランを格納できます。たとえば、IF は単純であると想定しています。 IF @Parameter1 IS NOT NULL
SchmitzIT の答えは、SQL Server が動的 SQL の実行パスも格納できるという点で正しいです。ただし、これは、SQL が適切に構築および実行されている場合にのみ当てはまります。
適切に構築されるとは、パラメーターを明示的に宣言し、それらを sp_executesql に渡すことを意味します。例えば
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
ご覧のとおり、sqlcommand テキストは、使用するパラメーター値をハードコーディングしていません。それらは exec sp_executesql で別々に渡されます
悪い古い動的 sql を記述した場合
set @sqlcommand = N'Select Something from Table where Field1 = ' + @Param1 + ' AND Field2 = ' + @Param2
exec sp_executesql @sqlcommand
その場合、SQL Server は実行計画を保存できません