Dynaamisen SQL:n käyttö EXEC:n ja sp-execute-sql:n kanssa

Valmis

Dynamic SQL:n avulla voit luoda merkkimerkkijonon, joka voidaan suorittaa T-SQL:nä vaihtoehtona tallennetuille toimintosarjoille. Dynaamisesta SQL:stä on hyötyä, kun et tiedä tiettyjä arvoja ennen suoritusaikaa.

Dynaamisen SQL:n luomiseen on kaksi tapaa, joko seuraavia:

  1. EXECUTE- tai EXEC-avainsanat .
  2. Järjestelmän tallentamisen toimintosarja sp_executesql.

Dynaaminen SQL, joka käyttää EXECUTE- tai EXEC-funktiota

Jos haluat kirjoittaa dynaamisen SQL-lauseen EXECUTE- tai EXEC-funktiolla, syntaksi on seuraava:

EXEC (@string_variable);

Seuraavassa esimerkissä esitellään muuttuja @sqlstring , jonka tyyppi on VARCHAR, ja määritetään sille merkkijono.

DECLARE @sqlstring AS VARCHAR(1000);
    SET @sqlstring='SELECT customerid, companyname, firstname, lastname 
    FROM SalesLT.Customer;'
EXEC(@sqlstring);
GO

Dynaamista SQL:ää Sp_executesql käyttämällä

Sp_executesql avulla voit suorittaa T-SQL-lausekkeen parametreilla. Sp_executesql voidaan käyttää tallennettujen toimintosarjojen sijaan, kun haluat välittää lausekkeelle eri arvon. T-SQL-lauseke pysyy samana, ja vain parametriarvot muuttuvat. Tallennettujen toimintosarjojen tavoin on todennäköistä, että SQL Serverin kyselyoptimointi käyttää suoritussuunnitelmaa uudelleen.

Sp_executesql käyttää argumenttina T-SQL-lauseketta, joka voi olla joko Unicode-vakio tai Unicode-muuttuja. Molemmat koodiesimerkit ovat esimerkiksi kelvollisia:

DECLARE @sqlstring1 NVARCHAR(1000);
SET @SqlString1 =
    N'SELECT TOP(10) name, listprice
    FROM SalesLT.Product
    GROUP BY name, listprice
    ORDER BY listprice DESC;'
EXECUTE sp_executesql @SqlString1;

OR

EXECUTE sp_executesql N'SELECT TOP(10) name, listprice
    FROM SalesLT.Product
    GROUP BY name, listprice
    ORDER BY listprice DESC;'

Tässä esimerkissä parametri välitetään T-SQL-lauseeseen:

EXECUTE sp_executesql   
          N'SELECT * FROM SalesLT.Customer   
          WHERE CompanyName = @company',  
          N'@company nvarchar(128)',  
          @company = "Sharp Bikes";