Dinamikus SQL használata EXEC és sp-execute-sql használatával

Befejezett

A dinamikus SQL lehetővé teszi egy karaktersztring összeállítását, amely T-SQL-ként végrehajtható a tárolt eljárások alternatívaként. A dinamikus SQL akkor hasznos, ha nem ismer bizonyos értékeket a végrehajtási időig.

A dinamikus SQL-t kétféleképpen hozhatja létre a következő módokon:

  1. EXECUTE vagy EXEC kulcsszavak.
  2. A rendszer által tárolt eljárás sp_executesql.

Dinamikus SQL EXECUTE vagy EXEC használatával

Dinamikus SQL-utasítás execute vagy EXEC használatával történő írásához a szintaxis a következő:

EXEC (@string_variable);

Az alábbi példában egy VARCHAR típusú változót @sqlstring deklarálunk, majd egy sztringet rendelünk hozzá.

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

Dinamikus SQL Sp_executesql használatával

Sp_executesql lehetővé teszi egy T-SQL-utasítás paraméterekkel való végrehajtását. Sp_executesql használható a tárolt eljárások helyett, ha egy másik értéket szeretne átadni az utasításnak. A T-SQL utasítás változatlan marad, és csak a paraméterértékek változnak. A tárolt eljárásokhoz hasonlóan valószínű, hogy az SQL Server lekérdezésoptimalizálója újra felhasználja a végrehajtási tervet.

Sp_executesql argumentumként egy T-SQL-utasítást használ, amely Unicode-állandó vagy Unicode-változó lehet. Például mindkét kód példa érvényes:

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;'

Ebben a példában a rendszer egy paramétert ad át a T-SQL utasításnak:

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