Using sp_executesql
wykonać ciąg, zaleca się używanie sp_wykonaćsql procedura składowana zamiast instrukcja wykonać.Ponieważ ta procedura składowana obsługuje Podstawienie parametru sp_executesql jest bardziej uniwersalny niż wykonywanie; Ponieważ sp_executesql generuje wykonanie planów, które są bardziej prawdopodobne, że ponownie przez SQL Server, sp_executesql jest bardziej wydajny niż wykonywanie.
Samodzielne partii
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.Dla partii niezależnym obowiązują następujące reguły:
Transact-SQL instrukcja w sp_executesql lub wykonywanie ciąg nie są kompilowane do planu realizacji, aż do sp_executesql lub wykonywania instrukcja EXECUTE.Ciągi nie są analizowane lub zaznaczone błędy, dopóki nie są wykonywane.Nazwy, do których odwołuje się ciągi nie są rozpoznawane, dopóki nie są wykonywane.
Transact-SQL Sprawozdań w ciąg wykonane nie mają dostępu do żadnych zmienne zadeklarowane w partia, która zawiera sp_executesql lub instrukcja EXECUTE.Partia zawierająca sp_executesql lub instrukcja EXECUTE nie mają dostępu do zmiennych lub lokalnym kursory zdefiniowane w ciąg wykonane.
Jeśli wykonywany ciąg zawiera instrukcję użycia, że zmiany kontekstu bazy danych, zmiany kontekstu bazy danych obowiązuje tylko do sp_executesql lub zakończeniu instrukcja EXECUTE.
Uruchomione następujące dwie partie ilustruje następujące punkty:
/*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
Podstawianie wartości parametrów
sp_executesql obsługuje podstawianie wartości parametrów parametrów, które są określone w Transact-SQL ciąg, ale nie instrukcja EXECUTE nie.Dlatego Transact-SQL ciągów, które są generowane przez sp_executesql bardziej przypominają niż generowane przez instrukcja EXECUTE. SQL Server optymalizator kwerendy prawdopodobnie będzie pasował do Transact-SQL sprawozdania z sp_executesql z realizacji planów z poprzednio oświadczeń, zapisywanie obciążenie związane z kompilacji nowego planu wykonania.
Z instrukcja EXECUTE wszystkich wartości parametru muszą być konwertowane na znak lub Unicode i dokonanych w ramach Transact-SQL ciąg.
Jeśli instrukcja jest wykonywane wielokrotnie, w zupełnie nowy Transact-SQL ciąg muszą zostać utworzone dla każdego wykonanie nawet wtedy, gdy są tylko różnice w wartościach podany dla parametrów.Generuje dodatkowe obciążenie w następujący sposób:
Zdolność SQL Server optymalizator kwerendy do pasują do nowych Transact-SQL ciąg znaków z istniejących planów wykonywania jest utrudniona przez stale zmiany wartości parametru w tekście ciągu, szczególnie w przypadku zespolonych Transact-SQL instrukcji.
Cały ciąg musi odbudowany wykonywanie każdego.
Wartości parametrów (innych niż znak lub wartości Unicode) muszą być oddane do formatu Unicode lub znak dla każdego wykonanie.
sp_executesql obsługuje ustawienie wartości parametru oddzielnie od Transact-SQL ciąg:
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 oferuje następujące dodatkowe korzyści:
Ponieważ tekstu Transact-SQL Instrukcja nie zmienia się między wykonania, powinna odpowiadać optymalizator kwerendy Transact-SQL instrukcji w wykonaniu drugiego z plan wykonania wygenerowany dla pierwszego wykonania.Dlatego SQL Server nie ma skompilować druga instrukcja.
Transact-SQL Ciąg jest zbudowany tylko jeden czas.
Parametr liczba całkowita jest określony w jego format macierzysty.Konwersja Unicode nie jest wymagane.
Ostrzeżenie
Obiekt nazwy w instrukcja ciąg musi być w pełni kwalifikowana dla SQL Server do ponownego użycia wykonanie planu.
Ponowne używanie wykonanie planów
W starszych wersjach SQL Server, jedynym sposobem możliwość ponownego użycia planów wykonać jest zdefiniowanie Transact-SQL instrukcji procedura składowana, a aplikacja wykonać procedura składowana.Generuje dodatkowe obciążenie administracyjne dla aplikacji.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.Ponieważ Transact-SQL same instrukcje pozostaje stała i tylko zmiana wartości parametru, SQL Server optymalizator kwerendy jest prawdopodobne, że ponownie plan wykonania generuje dla pierwszego wykonania.
Poniższy przykład tworzy i wykonuje DBCC CHECKDB instrukcja dla każdej bazy danych na serwerze, z wyjątkiem dla czterech bazy danych systemu.
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
SQL Server Używa sterownika ODBC sp_executesql do zaimplementowania SQLExecDirect po Transact-SQLinstrukcja jest wykonywany zawiera znaczniki parametr związanego. To rozszerzenie korzyści dostarczonych przez sp_executesql do wszystkich aplikacji korzystających z ODBC lub zdefiniowane przez ODBC, takich jak podstawowych RDO interfejsów API.Istniejące aplikacje ODBC przesyłanego do SQL Server automatycznie pobierać wzrost wydajności bez konieczności ponownego.Jedynym wyjątkiem jest sp_executesql nie jest używany z parametrami danych na wykonanie.Aby uzyskać więcej informacji, zobacz Używanie parametrów w instrukcji.
SQL Server Macierzystego dostawcy ODBC klienta używa również sp_executesql do zaimplementowania bezpośrednie wykonanie sprawozdań z parametrami związanego.Aplikacje korzystające z OLE DB lub obiektów ADO uzyskanie korzyści dostarczonych przez sp_executesql bez konieczności ponownego.
Zobacz także