Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Ottimizzazione dinamica di SQL e stored procedure

Se si dispone di più blocchi IF nidificati, SQL Server sarà in grado di archiviare i piani di esecuzione. Suppongo che gli IF siano semplici, ad es. SE @Parameter1 NON È NULL

La risposta di SchmitzIT è corretta sul fatto che SQL Server può anche archiviare percorsi di esecuzione per SQL dinamico. Tuttavia questo è vero solo se sql è compilato ed eseguito correttamente.

Per correttamente costruito, intendo dichiarare esplicitamente i parametri e passarli a sp_executesql. Ad esempio

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

Come puoi vedere, il testo sqlcommand non codifica i valori dei parametri da utilizzare. Vengono passati separatamente in exec sp_executesql

Se scrivi un vecchio sqL dinamico scadente

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

exec sp_executesql @sqlcommand

quindi SQL Server non sarà in grado di archiviare i piani di esecuzione