Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

SQL dinâmico e otimização de procedimentos armazenados


Se você tiver vários blocos IF aninhados, o SQL Server poderá armazenar planos de execução. Estou assumindo que os IFs são diretos, por exemplo. SE @Parâmetro1 NÃO É NULO

A resposta de SchmitzIT está correta de que o SQL Server também pode armazenar caminhos de execução para SQL dinâmico. No entanto, isso só é verdade se o sql for construído e executado corretamente.

Por corretamente construído, quero dizer explicitamente declarar os parâmetros e passá-los para sp_executesql. Por exemplo
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

Como você pode ver, o texto do comando sql não codifica os valores de parâmetro a serem usados. Eles são passados ​​separadamente no exec sp_executesql

Se você escrever sql dinâmico antigo e ruim
set @sqlcommand = N'Select Something from Table where Field1 = ' + @Param1  + ' AND Field2 = ' + @Param2

exec sp_executesql @sqlcommand

então o SQL Server não poderá armazenar planos de execução