Aracılığıyla paylaş


Sp_executesql kullanma

Bir dize yürütmek için kullanacağınız öneririz Sp_executesql yordamı EXECUTE deyim yerine saklanır.Bu saklı yordam parametresi yerine koyma, desteklediğinden Sp_executesql yürütmek; daha çok yönlü ve Sp_executesql tarafından yeniden kullanılması daha büyük olasılıkla yürütmek planları oluşturur.SQL Server, Sp_executesql yürütmek daha etkilidir.

Kendi içinde bütünlük oluşturan toplu işlemleri

When either sp_executesql or the EXECUTE statement executes a string, the string is executed as its own self-contained batch.SQL Server compiles the Transact-SQL statement or statements in the string into an execution plan that is separate from the execution plan of the batch that contained the sp_executesql or the EXECUTE statement.Aşağıdaki kurallar, kendi içinde bütünlük oluşturan toplu işlemi için geçerlidir:

  • The Transact-SQL statements in the sp_executesql or yürütmek dize are not compiled into an execution plan until sp_executesql or the yürütmek deyim are executed.Dizelerin değil ayrıştırıldı veya bunların yürütülme kadar hatalara karşı denetlenir.Bunlar yürütülür kadar dizeleri başvurulan adların çözümlenir.

  • The Transact-SQL statements in the executed dize do not have access to any variables declared in the toplu iş that contains sp_executesql or the yürütmek deyim.Içeren toplu iş Sp_executesql veya yürütmek deyim değişkenlerin ya da yürütülen içinde tanımlanan bir yerel imleç erişimi olmayan dize.

  • Yürütülmüş dizesi veritabanı içeriğini değiştirir bir USE deyim içeriyorsa, veritabanı içeriğini değişikliği yalnızca kadar sürer Sp_executesql ya da yürütmek deyim çalışmasını bitirdi.

Aşağıdaki iki toplu işlemi çalıştırmadan bu noktaları gösterilmektedir:

/*Show not having access to variables from the calling batch. */
DECLARE @CharVariable CHAR(3);
SET @CharVariable = 'abc';
/* sp_executesql fails because @CharVariable has gone out of scope. */
EXECUTE sp_executesql N'PRINT @CharVariable';
GO

/* Show database context resetting after sp_executesql finishes. */
USE master;
GO
EXECUTE sp_executesql N'USE AdventureWorks;'
GO
/* This statement fails because the database context
   has now returned to master. */
SELECT * FROM Sales.Store;
GO

Parametre değerleri değiştirme

Sp_executesql içinde belirtilen herhangi bir parametre için parametre değerleri değiştirme destekler.Transact-SQL dize, ancak yürütmek deyim desteklemez. Bu nedenle, Transact-SQL oluşturduğu dizeleri Sp_executesql yürütmek deyim ile oluşturulan daha fazla benzer.The SQL Server sorgu iyileştiricisi will probably match the Transact-SQL statements from sp_executesql with execution plans from the previously executed statements, saving the overhead of compiling a new execution plan.

yürütmek deyim ile tüm parametre değerleri olmalı veya Unicode karakter dönüştürülür ve bir parçası olarak yapılan Transact-SQL Dize.

Deyim tekrar tekrar tümüyle yeni gerçekleştirildiğinde Transact-SQL Tek farklılık parametreleri için sağlanan değer olsa bile dize her bir çalıştırma için yerleşik gerekir. Bu, aşağıdaki yollarla ek yükü oluşturur:

  • Yeteneği SQL Server Yeni eşleştirmek için sorgu iyileştiricisi Transact-SQL dize ile varolan bir yürütme planı sürekli değişen parametre değerlerini dizede, özellikle karmaşık metnine göre hampered Transact-SQL ifadeler.

  • Bütün dize her çalıştırılmak üzere yeniden oluşturulması gerekir.

  • Parametre değerleri (karakter veya Unicode değerler dışında) bir karakter veya Unicode biçimini her bir çalıştırma için dönüştürmelisiniz.

Sp_executesql ayarı, parametre değerlerini ayrı ayrı desteklerTransact-SQL Dize:

DECLARE @IntVariable INT;
DECLARE @SQLString NVARCHAR(500);
DECLARE @ParmDefinition NVARCHAR(500);

/* Build the SQL string one time. */
SET @SQLString =
     N'SELECT * FROM AdventureWorks.Sales.Store WHERE SalesPersonID = @SalesID';
/* Specify the parameter format one time. */
SET @ParmDefinition = N'@SalesID int';

/* Execute the string with the first parameter value. */
SET @IntVariable = 275;
EXECUTE sp_executesql @SQLString, @ParmDefinition,
                      @SalesID = @IntVariable;
/* Execute the same string with the second parameter value. */
SET @IntVariable = 276;
EXECUTE sp_executesql @SQLString, @ParmDefinition,
                      @SalesID = @IntVariable;

Sp_executesql ek aşağıdaki yararları sağlar:

  • Çünkü gerçek metnini de Transact-SQL Deyim Yürütme arasında değiştirmek için sorgu iyileştiricisi eşleşmelidir 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'a dönüştürme gerekli değildir.

    Not

    Nesne adları deyim dizesindeki için tam olarak nitelenmiş olmalıdır. SQL Server yürütme planı yeniden kullanmak için .

Yürütme yeniden planları

' Ün önceki sürümlerinde SQL Server, yürütmek planları yeniden yapabilmek için tek yol tanımlamaktır Transact-SQL ifadeler olarak saklı yordam ve saklı yordamını uygulama. Bu, uygulamaların ek yönetimsel yükü oluşturur.Using sp_executesql can help reduce this overhead and still let SQL Server reuse execution plans.sp_executesql can be used instead of stored procedures when executing a Transact-SQL statement several times, when the only variation is in the parameter values supplied to the Transact-SQL statement.Çünkü Transact-SQL Sabit ve yalnızca parametre değerlerini değiştirme, kendilerini ifadeleri kalır SQL Server sorgu iyileştiricisi, ilk çalıştırma için oluşturduğu yürütme planı yeniden olasıdır.

Aşağıdaki örnek oluşturur ve yürüten bir DBCC CHECKDB deyim için dört sistem veritabanları dışında bir sunucuda her veritabanı için.

USE master;
GO
SET NOCOUNT ON;
GO
DECLARE AllDatabases CURSOR FOR
SELECT name FROM sys.databases WHERE database_id > 4
OPEN AllDatabases

DECLARE @DBNameVar NVARCHAR(128)
DECLARE @Statement NVARCHAR(300)

FETCH NEXT FROM AllDatabases INTO @DBNameVar
WHILE (@@FETCH_STATUS = 0)
BEGIN
   PRINT N'CHECKING DATABASE ' + @DBNameVar
   SET @Statement = N'USE ' + @DBNameVar + CHAR(13)
      + N'DBCC CHECKDB (' + @DBNameVar + N')' + N'WITH PHYSICAL_ONLY'
   EXEC sp_executesql @Statement
   PRINT CHAR(13) + CHAR(13)
   FETCH NEXT FROM AllDatabases INTO @DBNameVar
END

CLOSE AllDatabases
DEALLOCATE AllDatabases
GO
SET NOCOUNT OFF;
GO

The SQL Server ODBC driver uses sp_executesql to implement SQLExecDirect when the Transact-SQL deyim that is being executed contains bound parameter markers. Bunun sağladığı avantajları genişletir Sp_executesql ODBC veya üzerinden RDO gibi ODBC tanımlı Apı'leri kullanan tüm uygulamalar için.Varolan bir ODBC uygulamaları için bağlantı noktası kurulmuş SQL Server performans artışı yazılmış gerekmeden otomatik olarak alın. Olan bir özel durum Sp_executesql yürütme sırasında veri parametrelerle birlikte kullanılır.Daha fazla bilgi için bkz:Ekstre parametreleri kullanma.

The SQL Server Native istemci ODBC sağlayıcı also uses sp_executesql to implement the direct execution of statements with bound parameters.OLE DB veya ADO kullanan uygulamalar sağladığı avantajları geçirmesine... Sp_executesql yazılmış gerek kalmadan.