sql >> Base de Datos >  >> RDS >> Sqlserver

SQL dinámico y optimización de procedimientos almacenados

Si tiene varios bloques IF anidados, SQL Server podrá almacenar planes de ejecución. Supongo que los IF son sencillos, por ejemplo. SI @Parameter1 NO ES NULO

La respuesta de SchmitzIT es correcta, ya que SQL Server también puede almacenar rutas de ejecución para Dynamic SQL. Sin embargo, esto solo es cierto si el sql se construye y ejecuta correctamente.

Por construido correctamente, me refiero a declarar explícitamente los parámetros y pasarlos a sp_executesql. Por ejemplo

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 puede ver, el texto de sqlcomand no codifica los valores de los parámetros que se van a usar. Se pasan por separado en el exec sp_executesql

Si escribe mal viejo sqL dinámico

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

exec sp_executesql @sqlcommand

entonces SQL Server no podrá almacenar planes de ejecución