sql >> Database >  >> RDS >> Sqlserver

Dynamische SQL en opgeslagen procedure optimalisatie

Als u meerdere geneste IF-blokken hebt, kan SQL Server uitvoeringsplannen opslaan. Ik ga ervan uit dat de IF's eenvoudig zijn, bijv. ALS @Parameter1 NIET NULL IS

Het antwoord van SchmitzIT is correct dat SQL Server ook uitvoeringspaden voor Dynamic SQL kan opslaan. Dit is echter alleen waar als de sql correct is gebouwd en uitgevoerd.

Met goed gebouwd bedoel ik het expliciet declareren van de parameters en doorgeven aan sp_executesql. Bijvoorbeeld

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

Zoals u kunt zien, codeert de sqlcommand-tekst de te gebruiken parameterwaarden niet. Ze worden afzonderlijk doorgegeven in de exec sp_executesql

Als je slechte oude dynamische sqL schrijft

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

exec sp_executesql @sqlcommand

dan kan SQL Server geen uitvoeringsplannen opslaan



  1. Voeg meerdere rijen in SQLite-fout in (foutcode =1)

  2. Hoe in te checken in een andere tabel heeft geen gegevens tijdens het doen van mysql join?

  3. RTRIM of REGEXP_REPLACE gebruiken om een ​​komma te vervangen door een kommaruimte en een enkel aanhalingsteken

  4. Deel 2 – Een groot databasediagram organiseren?