Aracılığıyla paylaş


Sp_executeSQL kullanma

Bir dize yürütmek için biz size kullanmanızı öneririz sp_executesql saklı yordam execute deyim yerine.Bu saklı yordam parametre değiştirme desteklediğinden sp_executesql EXECUTE'den; daha çok yönlü olduğu ve çünkü sp_executesql tarafından tekrar daha yüksektir yürütme planları oluşturur SQL Server, sp_executesql execute daha etkilidir.

Kendi içinde 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.Kendi içinde toplu işlemleri için aşağıdaki kurallar geçerlidir:

  • The Transact-SQL statements in the sp_executesql or EXECUTE string are not compiled into an execution plan until sp_executesql or the EXECUTE statement are executed.Dizeleri ayrýþtýrýlmýþ veya bunların yürütülme kadar hatalara karşı denetlenir.Dizelerdeki başvurulan adları çözülür kadar bunlar yürütülür.

  • The Transact-SQL statements in the executed string do not have access to any variables declared in the batch that contains sp_executesql or the EXECUTE statement.İçeren toplu iş sp_executesql ya da execute deyim değişkenleri veya yerel imleçler yürütülen tanımlanan erişim yok dize.

  • Yürütülen dize veritabanı bağlamı yalnızca ne kadar değişiklik veritabanı içeriğini değiştirir bir use deyim içerir sp_executesql ya da execute deyim çalışması bittikten.

Aşağıdaki iki toplu işlemlerini çalıştıran 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 AdventureWorks2008R2;'
GO
/* This statement fails because the database context
   has now returned to master. */
SELECT * FROM Sales.Store;
GO

Parametre değerlerini değiştirme

Sp_executesql içinde belirtilen herhangi bir parametre için parametre değerlerini değiştirme destekler Transact-SQL dize, ancak execute deyim yapar değil.Bu nedenle, Transact-SQL dizeleri tarafından üretilen sp_executesql execute deyim tarafından oluşturulan çok daha benzer.The SQL Server query optimizer 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.

execute deyim ile tüm parametre değerlerini karakter veya Unicode dönüştürülür ve gerekir bir parçası yapılan Transact-SQL dize.

Deyim tekrar tekrar, tamamen yeni yürütülürse Transact-SQL dize yerleşik, her yürütme bile, tek fark var değerlerinde sağlanan parametreleri.Bu, aşağıdaki şekillerde ek yükü oluşturur:

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

  • Bütün dize her yürütme için yeniden oluşturulması gerekir.

  • Her yürütme için parametre değerleri (karakter veya Unicode değerleri dışında) bir karakter veya Unicode biçimine dönüştürülmelidir.

Sp_executesql parametre değerleri ayrı ayrı ayarını destekleyen Transact-SQL dize:

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

/* Build the SQL string one time. */
SET @SQLString =
     N'SELECT * FROM AdventureWorks2008R2.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 avantajları şunlardır:

  • Çünkü gerçek metnini de Transact-SQL deyim değişmez yürütmeler arasında sorgu en iyi duruma getiricisi eşleşmesi gereken Transact-SQL deyim ilk yürütme. için oluşturulan yürütme planı ile ikinci yürütülmesineBu nedenle, SQL Server sahip değil derleme ikinci deyim.

  • The Transact-SQL string is built only one time.

  • Tamsayı parametre içinde belirtilen kendi yerel biçim.Unicode'a dönüştürme gerekli değildir.

    Not

    Nesne adlarında deyim dize için tam olarak SQL Server için yeniden yürütme planı.

Yeniden yürütme planları

Önceki sürümlerinde SQL Server, yürütmek planları yeniden kullanmak tek yolu tanımlamaktır Transact-SQL bir saklı yordam olarak ifadeleri ve saklı yordam yürütmesine uygulamaBu uygulamalar için 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 sabiti ve yalnızca parametre değerleri değiştirme, kendilerini ifade kalır SQL Server sorgu iyileştiricisi büyük bir olasılıkla onu oluþturur ilk yürütme için yürütme planı yeniden

Aşağıdaki örnek oluşturur ve çalıştırır bir DBCC CHECKDB deyim her veritabanı sunucusunda haricinde dört sistem veritabanları.

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 statement that is being executed contains bound parameter markers.Bu sağladığı avantajları genişletir sp_executesql odbc veya rdo gibi odbc üzerinden tanımlanan API'leri kullanan tüm uygulamalar için.Bağlantı noktası ve kurulmuş varolan odbc uygulamaları SQL Server performans artışı yazılmaları gerek kalmadan otomatik olarak alın.Bunun tek istisnası olan sp_executesql yürütme sırasında veri parametreleri ile birlikte kullanılmaz.Daha fazla bilgi için bkz: Deyimi parametre kullanma.

The SQL Server Native Client ODBC Provider also uses sp_executesql to implement the direct execution of statements with bound parameters.ole db veya ado kullanan uygulamalar tarafından sağlanan avantajlar elde sp_executesql yazılmaları gerek kalmadan.