sql >> Databasteknik >  >> RDS >> Sqlserver

Dynamisk SQL och lagrad procedur optimering

Om du har flera kapslade IF-block kommer SQL Server att kunna lagra exekveringsplaner. Jag antar att IF:erna är enkla, t.ex. OM @Parameter1 INTE ÄR NULL

SchmitzITs svar är korrekt att SQL Server även kan lagra exekveringsvägar för Dynamic SQL. Detta är dock bara sant om sql är korrekt byggt och kört.

Med korrekt byggd menar jag att explicit deklarera parametrarna och skicka dem till sp_executesql. Till exempel

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

Som du kan se hårdkodar inte sqlcommand-texten de parametervärden som ska användas. De skickas separat i exec sp_executesql

Om du skriver dålig gammal dynamisk sqL

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

exec sp_executesql @sqlcommand

då kommer inte SQL Server att kunna lagra exekveringsplaner



  1. Oracle-leverantör för Oledb saknas i VS 2015 Shell

  2. Spelar ordningsföljden på tabellerna som hänvisas till i ON-klausulen i JOIN någon roll?

  3. Returnera rader från INSERT med ON CONFLICT utan att behöva uppdatera

  4. SQL Räkna dagar till första i månaden