EXEC ve sp-execute-sql ile dinamik SQL kullanma

Tamamlandı

Dinamik SQL, saklı yordamlara alternatif olarak T-SQL olarak yürütülebilen bir karakter dizesi oluşturmanıza olanak tanır. Dinamik SQL, yürütme süresine kadar belirli değerleri bilmediğiniz durumlarda kullanışlıdır.

Dinamik SQL oluşturmanın iki yolu vardır:

  1. EXECUTE veya EXEC anahtar sözcükler.
  2. Sistem saklı yordamı sp_executesql.

EXECUTE veya EXEC kullanarak dinamik SQL

veya EXECile EXECUTE dinamik SQL deyimi yazmak için söz dizimi şöyledir:

EXEC (@string_variable);

Aşağıdaki örnekte, VARCHAR türünde adlı @sqlstring bir değişken bildirir ve sonra buna bir dize atarız.

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

Warning

geçirilen EXEC dize, kullanıcı tarafından sağlanan giriş birleştirilerek oluşturulduysa, kod SQL eklemeye karşı savunmasızdır. Hiçbir zaman doğrulanmamış girişi dinamik bir SQL dizesiyle birleştirmeyin. Kullanıcı tarafından sağlanan değerlerin eklenmesi gerektiğinde, bunun yerine parametrelerle kullanın sp_executesql ; bu, SQL metnini sabit tutar ve değerleri ayrı olarak geçirir ve bu da ekleme yüzeyini ortadan kaldırır.

sp_executesql kullanarak dinamik SQL

sp_executesql , parametrelerle bir T-SQL deyimi yürütmenize olanak tanır. sp_executesql deyimine farklı bir değer geçirmek istediğinizde saklı yordamlar yerine kullanılabilir. T-SQL deyimi aynı kalır ve yalnızca parametre değerleri değişir. Saklı yordamlar gibi, SQL Server sorgu iyileştiricisinin yürütme planını yeniden kullanma olasılığı yüksektir.

sp_executesql bir T-SQL deyimini bağımsız değişken olarak alır ve bu bir Unicode sabiti veya Unicode değişkeni olabilir. Aşağıdaki örnekte bir değişken kullanılır:

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;

Aşağıdaki örnek doğrudan bir Unicode sabiti geçirir:

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

Bu örnekte, T-SQL deyimine bir parametre geçiriliyor:

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