Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Dynamische SQL- und Stored-Procedure-Optimierung

Wenn Sie mehrere verschachtelte IF-Blöcke haben, kann SQL Server Ausführungspläne speichern. Ich gehe davon aus, dass die IFs einfach sind, z. WENN @Parameter1 NICHT NULL IST

Die Antwort von SchmitzIT ist richtig, dass SQL Server auch Ausführungspfade für Dynamic SQL speichern kann. Dies gilt jedoch nur, wenn die SQL ordnungsgemäß erstellt und ausgeführt wird.

Mit richtig gebaut meine ich, dass die Parameter explizit deklariert und an sp_executesql übergeben werden. Zum Beispiel

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

Wie Sie sehen können, sind die zu verwendenden Parameterwerte im sqlcommand-Text nicht fest codiert. Sie werden separat im exec sp_executesql

übergeben

Wenn Sie schlechtes altes dynamisches SQL schreiben

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

exec sp_executesql @sqlcommand

dann kann SQL Server keine Ausführungspläne speichern