Udostępnij za pośrednictwem


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.