Aracılığıyla paylaş


Sp_executeSQL (Transact-SQL)

Yürüten bir Transact-SQL deyim veya olabilir toplu iş yeniden birçok kez ya da dinamik olarak tasarlanmış.Transact-SQLdeyim veya toplu iş katıştırılmış Parametreler içerebilir.

Güvenlik notuGüvenlik Notu

Çalışma saat-derlenmiş Transact-SQL ifadeleri göstermek kötü amaçlı saldırılara uygulamaları gibi SQL Injection.

Konu bağlantısı simgesiTransact-SQL sözdizimi kuralları

Sözdizimi

sp_executesql [ @statement = ] statement
[ 
  { , [ @params = ] N'@parameter_name data_type [ OUT | OUTPUT ][ ,...n ]' } 
     { , [ @param1 = ] 'value1' [ ,...n ] }
]

Bağımsız değişkenler

  • [ @statement= ] statement
    İçeren bir Unicode dize bir Transact-SQL deyim veya toplu iş. statement olması gereken bir Unicode sabit ya da bir Unicode değişken.İle iki dizeleri bitiştirme gibi daha karmaşık Unicode ifadeler, + işleç, izin verilmez.Karakter sabitler izin verilmez.Bir Unicode sabit belirtilmişse, onu ile eklenmelidir bir n.Örneğin, Unicode sabit n 'sp_who' geçerlidir, ancak karakter sabit 'sp_who' değil.dize boyutunu, yalnızca kullanılabilir veritabanı sunucusu belleğiyle sınırlıdır.64-Bit sunucularda dize boyutu 2 gb ile en büyük boyutu sınırlıdır nvarchar(max).

    Not

    stmtÖrneğin bir değişken adı olarak aynı form sahip Parametreler içerebilir: N'SELECT * FROM HumanResources.Employee WHERE EmployeeID = @IDParameter'

    Dahil her parametre stmt her ikisini de karşılık gelen bir giriş olmalıdır @params parametre tanımı listesi ve parametre değerleri listesi.

  • [ @params= N'@parameter_namedata_type,... n '
    Tanımları içinde katıştırılmış tüm parametreleri içeren bir dize stmt.Bir Unicode sabit veya değişken Unicode dize olmalıdır.Parametre adı ve veri türü her parametre tanımına oluşur.nEk parametre tanımları gösteren bir yer tutucudur.Belirtilen her parametre statement gerekir içinde tanımlanan @params.Transact-SQLdeyim veya toplu iş içinde stmt parametre içermediğinden @params gerekli değildir.Bu parametre için varsayılan değer null olur.

  • [ @param1= ] 'value1'
    Bir dizeparametresi tanımlı ilk parametre değeridir.Bir Unicode sabit veya değişken Unicode değeri olabilir.Dahil her parametre için sağlanan bir parametre değeri olmalıdır stmt.Değerleri ne zaman gerekli değildir Transact-SQL deyim veya toplu iş içinde stmt var. hiçbir parametreleri

  • [ OUT | ÇIKIŞ]
    Parametre bir çıktı parametresi gösterir.text, ntext, ve image parametreleri olarak kullanılabilir çıkış parametreleri olmadığı sürece yordamı, bir ortak dil çalışma zamanı (clr) yordamı.clr yordam yordam olmadığı sürece bir imleç yer tutucu çıktı anahtar sözcüğü kullanan bir çıkış parametresi olabilir.

  • n
    Ek parametre değerleri için bir yertutucudur.Değerler, yalnızca sabit veya değişken olabilir.Değerleri fonksiyonları gibi daha karmaşık ifadeler veya işleçleri kullanılarak oluşturulmuş ifadeler olamaz.

Dönüş Kodu Değerleri

0 (başarılı) veya sıfır olmayan (başarısız)

Sonuç Kümeleri

SQLdizeyerleşik SQL deyimlerinden sonuç kümeleri döndürür.

Açıklamalar

sp_executesqlexecute aynı davranışı için toplu işlemleri, kapsam adları ve veritabanı içeriği vardır.Transact-SQLdeyim veya toplu iş içinde sp_executesql stmt parametresi kadar derlenmiş değil sp_executesqldeyim yürütüldüğünde. İçeriğini stmt sonra derlenmiş ve yürütülen yürütme planı yürütme planı toplu iş , adlı'dan sp_executesql.sp_executesqltoplu iş toplu iş , çağıran bildirilen değişkenler başvuru sp_executesql.Yerel imleçler veya değişkenleri sp_executesql toplu iş toplu iş , çağıran için görünür değil sp_executesql.Veritabanını bağlamda yalnızca sonuna kadar son değiştirir sp_executesql deyim.

sp_executesqlsaklı yordamları yürütmek için yerine kullanılabilecek bir Transact-SQL deyim birden çok kez olduğunda parametre değerlerini deyim değişikliği yalnızca bir çeşitleme.Çünkü Transact-SQL sabit ve parametre değerlerini değiştirmek, SQL Serversorgu iyileştiricisi olasılığı yeniden yürütme planı oluşturur ilk yürütme.

Not

Performans kullanımı tam olarak artırmak için nesne adlarında deyim dizenitelenmiş.

sp_executesqlparametre değerleri ayrı ayrı ayarını destekleyen aşağıdaki örnekte gösterildiği gibiTransact-SQLdize .

DECLARE @IntVariable int;
DECLARE @SQLString nvarchar(500);
DECLARE @ParmDefinition nvarchar(500);

/* Build the SQL string one time.*/
SET @SQLString =
     N'SELECT BusinessEntityID, NationalIDNumber, JobTitle, LoginID
       FROM AdventureWorks2008R2.HumanResources.Employee 
       WHERE BusinessEntityID = @BusinessEntityID';
SET @ParmDefinition = N'@BusinessEntityID tinyint';
/* Execute the string with the first parameter value. */
SET @IntVariable = 197;
EXECUTE sp_executesql @SQLString, @ParmDefinition,
                      @BusinessEntityID = @IntVariable;
/* Execute the same string with the second parameter value. */
SET @IntVariable = 109;
EXECUTE sp_executesql @SQLString, @ParmDefinition,
                      @BusinessEntityID = @IntVariable;

Çıkış parametreleri de kullanılabilecek sp_executesql.iş aşağıdaki örnek alır AdventureWorks2008R2.HumanResources.Employeetablo ve çıktı parametresinde döndürür @max_title.

DECLARE @IntVariable int;
DECLARE @SQLString nvarchar(500);
DECLARE @ParmDefinition nvarchar(500);
DECLARE @max_title varchar(30);

SET @IntVariable = 197;
SET @SQLString = N'SELECT @max_titleOUT = max(JobTitle) 
   FROM AdventureWorks2008R2.HumanResources.Employee
   WHERE BusinessEntityID = @level';
SET @ParmDefinition = N'@level tinyint, @max_titleOUT varchar(30) OUTPUT';

EXECUTE sp_executesql @SQLString, @ParmDefinition, @level = @IntVariable, @max_titleOUT=@max_title OUTPUT;
SELECT @max_title;

Parametrelerinde koymak çalışabilme sp_executesql bir dize yürütmek için execute deyim kullanmak için aşağıdaki avantajları sunar:

  • Çünkü gerçek metnini de Transact-SQL deyim içinde sp_executesql dize yürütmeler arasında değiştirmek değil, büyük olasılıkla sorgu iyileştiricisi eşleşen Transact-SQL deyim ile oluşturulan ilk yürütme yürütme planı ikinci yürütülmesineBu nedenle, SQL Server İkinci deyimderlemek zorunda değildir.

  • Transact-SQLdize yalnızca bir saatüretilmiştir.

  • Tamsayı parametre, yerel biçimbelirtildi.Unicode çevrim gerekmez.

İzinler

Üyelik gerektiren public rolü.

Örnekler

A.Basit bir select deyimyürütme

Aşağıdaki örnek oluşturur ve basit bir yürütür SELECT deyim adlı katıştırılmış parametresi içeriyor @level.

EXECUTE sp_executesql 
          N'SELECT * FROM AdventureWorks2008R2.HumanResources.Employee 
          WHERE BusinessEntityID = @level',
          N'@level tinyint',
          @level = 109;

B.Dinamik olarak yerleşik bir dizeyürütme

Aşağıdaki örnekler kullanarak sp_executesql dinamik olarak yerleşik bir dize yürütmek .Örnek saklı yordam bir küme , bir yıl için satış verilerini bölümlemek için kullanılan tabloları veri eklemek için kullanılır.Aşağıdaki biçimi olan yılın her ayı için bir tablo vardır:

CREATE TABLE May1998Sales
    (OrderID int PRIMARY KEY,
    CustomerID int NOT NULL,
    OrderDate  datetime NULL
        CHECK (DATEPART(yy, OrderDate) = 1998),
    OrderMonth int
        CHECK (OrderMonth = 5),
    DeliveryDate datetime  NULL,
        CHECK (DATEPART(mm, OrderDate) = OrderMonth)
    )

Bu örnek saklı yordam dinamik olarak oluşturulur ve yürütülür bir INSERTYeni siparişleri doğru tabloeklemek içindeyim . Örnek veri içermelidir ve o adına eklediğini tablo adını oluşturmak için sipariş tarih kullanır bir INSERTdeyim.

Not

Bunun için basit bir örnek ise sp_executesql.Örnek hata denetimi içermiyor ve sipariş numaraları tablolar arasında yinelenmiyor güvence altına almak gibi iş kuralları, denetlediği içermez.

CREATE PROCEDURE InsertSales @PrmOrderID INT, @PrmCustomerID INT,
                 @PrmOrderDate DATETIME, @PrmDeliveryDate DATETIME
AS
DECLARE @InsertString NVARCHAR(500)
DECLARE @OrderMonth INT

-- Build the INSERT statement.
SET @InsertString = 'INSERT INTO ' +
       /* Build the name of the table. */
       SUBSTRING( DATENAME(mm, @PrmOrderDate), 1, 3) +
       CAST(DATEPART(yy, @PrmOrderDate) AS CHAR(4) ) +
       'Sales' +
       /* Build a VALUES clause. */
       ' VALUES (@InsOrderID, @InsCustID, @InsOrdDate,' +
       ' @InsOrdMonth, @InsDelDate)'

/* Set the value to use for the order month because
   functions are not allowed in the sp_executesql parameter
   list. */
SET @OrderMonth = DATEPART(mm, @PrmOrderDate)

EXEC sp_executesql @InsertString,
     N'@InsOrderID INT, @InsCustID INT, @InsOrdDate DATETIME,
       @InsOrdMonth INT, @InsDelDate DATETIME',
     @PrmOrderID, @PrmCustomerID, @PrmOrderDate,
     @OrderMonth, @PrmDeliveryDate

GO

Kullanarak sp_executesql Bu yordamda daha execute yürütmek için bir dizekullanmaktan daha etkilidir.Zaman sp_executesql olan kullanıldığında, yalnızca 12 sürümleri vardır, oluşturulan INSERT dize aylık her tabloiçin bir.execute ile her ekleme dize parametresi değerleri farklı olduğundan benzersizdir.Her iki yöntem de aynı sayıda toplu işlemi oluşturmak, ancak INSERT dizeleri benzerliğini tarafından üretilen sp_executesql daha olası olduğunu sorgu iyileştiricisi yeniden yaparyürütme planları.

C.Çıkış parametresi kullanma

Aşağıdaki örnek bir OUTPUT tarafından üretilen sonuç kümesi depolamak için parametre SELECT deyim içinde @SQLString parametresi.İki SELECT ifadeleri sonra yürütülen değerini kullanan OUTPUT parametresi.

USE AdventureWorks2008R2;
GO
DECLARE @SQLString nvarchar(500);
DECLARE @ParmDefinition nvarchar(500);
DECLARE @SalesOrderNumber nvarchar(25);
DECLARE @IntVariable int;
SET @SQLString = N'SELECT @SalesOrderOUT = MAX(SalesOrderNumber)
    FROM Sales.SalesOrderHeader
    WHERE CustomerID = @CustomerID';
SET @ParmDefinition = N'@CustomerID int,
    @SalesOrderOUT nvarchar(25) OUTPUT';
SET @IntVariable = 22276;
EXECUTE sp_executesql
    @SQLString
    ,@ParmDefinition
    ,@CustomerID = @IntVariable
    ,@SalesOrderOUT = @SalesOrderNumber OUTPUT;
-- This SELECT statement returns the value of the OUTPUT parameter.
SELECT @SalesOrderNumber;
-- This SELECT statement uses the value of the OUTPUT parameter in
-- the WHERE clause.
SELECT OrderDate, TotalDue
FROM Sales.SalesOrderHeader
WHERE SalesOrderNumber = @SalesOrderNumber;

Ek örnekler için bkz: Sp_executesql kullanma.