Aracılığıyla paylaş


Sp_executesql (Transact-SQL)

Yürüten bir Transact-SQL birçok kez veya dinamik olarak oluşturulmuş bir deyim veya, bir toplu iş yeniden kullandı. The Transact-SQL deyim or toplu iş can contain embedded parameters.

Security noteSecurity Note:

saat derlenmiş çalıştırın. Transact-SQL ifadeleri gibi kötü niyetli saldırılara, uygulamaları hale getirebilir SQL ekleme.

Topic link iconTransact-SQL sözdizimi kuralları

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

Bağımsız değişkenler

  • [ @stmt = ] stmt
    Is a Unicode string that contains a Transact-SQL statement or batch.stmt must be either a Unicode constant or a Unicode variable.Ile iki dizeleri bitiştirmek gibi daha karmaşık Unicode ifadeler + işleç verilir.Karakter sabitler izin verilmez.Unicode sabit belirtilirse, ile eklenmelidir bir n.Örneğin, Unicode sabiti N 'sp_who' geçerlidir, ancak sabit karakter 'sp_who' değil.Dize boyutunu, yalnızca kullanılabilir veritabanı sunucusunun belleği tarafından sınırlandırılır.Dize boyutu 2 GB, en büyük boyutu 64-bit sunucularda sınırlıdır nvarchar(max).

    Not

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

    Dahil edilen her bir parametre stmt her ikisi 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 ] '
    Tüm parametrelerin içinde katıştırılmış tanımlarını içeren bir dize iş stmt. Dize, bir Unicode sabit veya değişken Unicode olması gerekir.Each parameter definition consists of a parameter name and a data type.n is a placeholder that indicates additional parameter definitions.Belirtilen her parametre stmt tanımlanmalıdır params.If the Transact-SQL deyim or toplu iş in stmt does not contain parameters, @params is not required.Bu parametre için varsayılan değer NULL olur.

  • [ **@**param1 = ] 'value1'
    Parametre içinde tanımlanan ilk parametre için bir değer mi dize.Değer, bir Unicode sabit veya değişken Unicode olabilir.Bulunan her parametre için verilen parametre değeri olmalıdır stmt. Değerler, gerekli olmayan Transact-SQL deyim veya toplu iş iş işlemi stmt parametre vardır.

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

  • n
    Ek parametre değerleri için yer tutucu olarak belirtilir.Değerler, yalnızca sabit veya değişken olabilir.Değerleri işlevleri gibi daha karmaşık ifadeler veya ifade işleçleri kullanarak yerleşik olamaz.

Dönüş Kodu Değerleri

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

Sonuç Kümeleri

Gelen SQL içinde yerleşik olan tüm SQL deyimleri sonuç ayarlar döndürür dize.

Remarks

Sp_executesql yürütmek olarak aynı davranışı ile için toplu işlem, kapsam adları ve veritabanı içerik var.The Transact-SQL statement or batch in the sp_executesql stmt parameter is not compiled until the sp_executesql statement is executed.Içeriği stmt sonra derlenmiş ve yürütme planı adlı bir toplu iş yürütme planından ayrı olarak yürütüldü. Sp_executesql.The sp_executesql toplu iş cannot reference variables declared in the toplu iş that calls sp_executesql.Yerel imleç veya değişkenleri Sp_executesql toplu çağıran toplu iş için görülebilir değildirSp_executesql.Veritabanı bağlamında, yalnızca sonuna kadar son değişiklikleri Sp_executesql deyim.

Sp_executesql yürütmek için saklı yordamlar yerine kullanılabilirTransact-SQL fazla sayıda parametre değişikliği Beyannameyi değer deyim yalnızca türevidir. Çünkü Transact-SQL deyim kendi sabit ve yalnızca parametre değerlerini değişikliği kalır SQL Server sorgu iyileştiricisi, ilk çalıştırma için oluşturduğu yürütme planı yeniden olasıdır.

Not

Performans kullanın tam olarak nitelenmiş nesne adları artırmanın deyim dize.

Sp_executesql ayarı, parametre değerlerini ayrı ayrı desteklerTransact-SQL Aşağıdaki örnekte gösterildiği gibi dize.

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

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

Çıkış parametreleri de birlikte kullanılabilir. Sp_executesql.Aşağıdaki örnek bir unvanını alır AdventureWorks.HumanResources.Employee Tablo ve çıktı parametresinde geri 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(Title) 
   FROM AdventureWorks.HumanResources.Employee
   WHERE ManagerID = @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;

Parametrelerde yerine çalışabilme Sp_executesql, bir dize çalıştırmak için yürütmek deyim kullanmak aşağıdaki yararları sağlar:

  • Çünkü gerçek metnini de Transact-SQL Deyimde Sp_executesql dizesi yürütmeler arasında değiştirmek için sorgu iyileştiricisi büyük olasılıkla eşleşecektir Transact-SQL ilk çalıştırma için oluşturulan yürütme planı ile ikinci yürütülmesine ekstresi. Bu nedenle, SQL Server ikinci deyim derleme yok.

  • The Transact-SQL dize is built only one saat.

  • Kendi özgün biçiminde tamsayı parametresi belirtildi.Unicode çevrim gerekli değildir.

İzinler

Üyelik gerektirir Ortak roldür.

Örnekler

C.Basit bir deyim yürütme

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

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

b.Dinamik olarak yerleşik bir dize yürütülüyor

Aşağıdaki örnek, kullanarak gösterir. sp_whoexecutesql dinamik olarak yerleşik bir dize yürütülemiyor.Örnek saklı yordamı, bir satış verilerinin bir yıl için bölüm için kullanılabilecek tabloları veri eklemek için kullanılır.Aşağıdaki biçimdedir 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, depolanan yordamın dinamik olarak oluşturulur ve yürüten bir INSERT yeni siparişler doğru eklemek için deyimi tablo. Örnek veri içermelidir ve sonra bu adı içine eklediğini tablonun adını oluşturmak için sipariş tarihini kullanır bir INSERT deyim.

Not

Basit bir örnek için budur. Sp_executesql.Örnek hata denetimi içermiyor ve iş kuralları, sıra numaralarını tablolar arasında çoğaltılır guaranteeing gibi denetimleri içerir.

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

Bu alternatif Sp_executesql bu yordamın bir dize çalıştırmak için yürütmek kullanmaktan daha verimlidir.Ne zaman Sp_executesql , oluşturulan, INSERT dize bir aylık her tablo için 12 sürümleri vardır.Parametre değerleri farklı olduğundan yürütmek ile her INSERT benzersiz dize.Ancak, her iki yöntem de aynı sayıda toplu işlemi tarafından oluşturulan INSERT dizelerinin benzerliği oluşturun... Sp_executesql daha olası en iyi duruma getiricisi sorgu yürütme planları yeniden kullanacaksanız kolaylaştırır.

c.ÇıKıŞ parametresi kullanma

Aşağıdaki örnek bir OUTPUT parametre tarafından oluşturulan sonuç kümesi'ni depolamak için SELECT Deyimde @SQLString Parametre. Iki SELECT ifadeleri değerini kullanın, sonra yürütülür OUTPUT Parametre.

USE AdventureWorks;
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;

Diğer örnekler için bkz: Sp_executesql kullanma.