Udostępnij za pośrednictwem


sp_executesql (języka Transact-SQL)

Wykonuje Transact-SQL instrukcja lub partia może być ponownie użyty wiele razy lub taki, który został utworzony dynamicznie.Transact-SQLinstrukcja lub partia może zawierać osadzony parametrów.

Uwaga dotycząca zabezpieczeńUwaga dotycząca zabezpieczeń

czasjednostkowy-skompilowany Transact-SQL sprawozdań może narazić aplikacji złośliwymi atakami, takich jak iniekcjiSQL.

Ikona łącza do tematuJęzyka Transact-SQL składni konwencje

Składnia

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

Argumenty

  • [ @statement= ] statement
    Jest ciąg Unicode, który zawiera Transact-SQL instrukcja lub program partia. statement musi być Unicode stała lub zmienna Unicode.Bardziej złożonych wyrażeń Unicode, takiego jak konkatenację dwóch ciągów z operator+ nie są dozwolone.Stałe znaków nie są dozwolone.Jeżeli określono wartość Unicode stała , musi być poprzedzona ciągiem n.Na przykład Unicode stała N 'sp_who' jest prawidłowa, ale znak stała 'sp_who' nie jest.Rozmiar ciąg jest ograniczona jedynie przez pamięć dostępne bazy danych serwera.Na serwerach 64-bitowym rozmiar ciąg jest ograniczony do 2 GB, maksymalny rozmiar nvarchar(max).

    Ostrzeżenie

    stmtmoże zawierać parametry mające ten sam formularz jako nazwę zmiennej, na przykład: N'SELECT * FROM HumanResources.Employee WHERE EmployeeID = @IDParameter'

    Każdy parametr zawarte w stmt musi mieć odpowiedni wpis w obu @params listy definicji parametrów oraz listy wartości parametru.

  • [ @params= N'@parameter_namedata_type,... n '
    Jest jeden ciąg , który zawiera definicje wszystkich parametrów, które zostały osadzone w stmt.ciąg musi być Unicode stała lub zmienna Unicode.Każda definicja parametru składa się z nazwy parametru i typ danych.nto symbol zastępczy, który wskazuje parametr dodatkowe definicje.Każdy parametr statement musi być zdefiniowana w @params.Jeśli Transact-SQL instrukcja lub partia w stmt nie zawiera parametry, @params nie jest wymagana.Domyślną wartością tego parametru jest NULL.

  • [ @param1= ] 'value1'
    To wartość pierwszego parametru, który jest zdefiniowany w ciągparametru.Wartość może być Unicode stała lub zmienna Unicode.Muszą być dostarczone dla każdego parametru w wartości parametru stmt.Wartości nie są wymagane podczas Transact-SQL instrukcja lub partia w stmt ma nie parametrów.

  • [ POZA | WYJŚCIE]
    Wskazuje, że parametr jest parametrem wyjściowym.text, ntext, i image Parametry mogą być używane jako parametry wyjściowe, chyba że procedura jest wspólne language runtime (CLR) procedury.Parametr wyjściowy, który wykorzystuje słowo kluczowe wyjścia może być zastępczy kursor , chyba że procedurą jest procedura CLR.

  • n
    Jest symbolem zastępczym dla wartości dodatkowych parametrów.Wartości mogą być tylko stałe lub zmienne.Nie mogą być bardziej złożonych wyrażeń takich jak funkcje lub wyrażeń zbudowany za pomocą operatorów.

Wartości kodów powrotnych

0 (sukces) lub od zera (błąd)

Zestawy wyników

Zwraca wynik ustawia się z instrukcji SQL wbudowane wciąg SQL.

Uwagi

sp_executesqlma takie samo jak wykonanie w odniesieniu do partii, zakres nazw i kontekstu bazy danych.Transact-SQLinstrukcja lub partia w sp_executesql stmt parametru nie jest kompilowany do sp_executesqlwykonaniuinstrukcja . Zawartość stmt następnie kompilowane i wykonywane jako plan wykonania oddzielnie od planu wykonania partia , o nazwie sp_executesql.sp_executesqlpartia nie może odwoływać się do zmiennych zadeklarowane w partia , która wywołuje sp_executesql.Kursory lokalnego lub zmiennych w sp_executesql partia są nie są widoczne dla partia , który wywołuje sp_executesql.Ostatnio zmiany w kontekście bazy danych tylko do końca sp_executesql instrukcja.

sp_executesqlmożna używać zamiast procedur przechowywanych do wykonać Transact-SQL instrukcja wielokrotnie podczas zmiany wartości parametrów w instrukcja jest tylko zmiana.Ponieważ Transact-SQL instrukcja samą pozostaje stała i zmienianie wartości parametrów SQL Server optymalizator kwerendy prawdopodobnie do ponownego użycia planu wykonania, które generuje dla pierwszego wykonania.

Ostrzeżenie

Aby zwiększyć wydajność wykorzystania pełni kwalifikowane nazwy obiektów w instrukcja ciąg.

sp_executesqlobsługuje ustawienie wartości parametru oddzielnie od Transact-SQL ciąg jak pokazano w poniższym przykładzie.

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

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

Parametry wyjściowe można również z sp_executesql.Poniższy przykład pobiera tytuł zadanie z AdventureWorks2008R2.HumanResources.Employee tabela i zwraca parametr wyjściowy @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(JobTitle) 
   FROM AdventureWorks2008R2.HumanResources.Employee
   WHERE BusinessEntityID = @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;

Można zastąpić parametrów w sp_executesql ma następujące zalety korzystania z instrukcja EXECUTE wykonać ciąg:

  • Ponieważ rzeczywisty tekst z Transact-SQL instrukcja w sp_executesql ciąg nie zmienia się między wykonania, prawdopodobnie będzie pasował do optymalizator kwerendy Transact-SQL instrukcja w drugim wykonaniu z plan wykonania wygenerowany dla pierwszego wykonania.W związku z tym SQL Server nie jest druga instrukcjaskompilować.

  • Transact-SQLciąg jest zbudowany tylko jeden czas.

  • Parametr liczba całkowita jest określony w format macierzysty.Rzutowanie na Unicode nie jest wymagane.

Uprawnienia

Wymaga członkostwa w public rolę.

Przykłady

A.Wykonywanie prostych instrukcjaSELECT

Poniższy przykład tworzy i wykonuje prosty SELECT instrukcja zawierającego osadzony parametr o nazwie @level.

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

B.Wykonywanie dynamicznie wbudowanego ciąg

W poniższym przykładzie za pomocą sp_executesql wykonać dynamicznie wbudowanego ciąg.Przykład procedura składowana jest używana do wstawiania danych do zestaw tabel, które są używane do partycji danych o sprzedaży na rok.Jest tabela dla każdego miesiąca w roku ma następujący format:

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)
    )

Ta próbka procedura składowana dynamicznie tworzy i wykonuje INSERT instrukcja wstawiać nowe zamówienia do właściwej tabela.W przykładzie użyto data zamówienia do budowy nazwy tabela , która powinna zawierać dane i dołącza tę nazwę do INSERT instrukcja.

Ostrzeżenie

Jest to prosty przykład dla sp_executesql.W przykładzie zawiera sprawdzanie błędów i nie obejmuje kontroli reguły biznesowe, takie jak zagwarantowanie numerów zamówień nie są duplikowane między tabelami.

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

Za pomocą sp_executesql w tej procedurze jest bardziej wydajny niż wykonać ciągza pomocą EXECUTE.Gdy sp_executesql jest używana, dostępne są tylko 12 wersje WSTAW ciąg , który są generowane, jeden dla każdej miesięcznej tabela.Z wykonywanie każdy WSTAW ciąg jest unikatowa, ponieważ wartości parametrów są różne.Chociaż obie metody generuje ten sam numer partii, podobieństwa ciągi WSTAWIANIA generowanych przez sp_executesql ułatwia bardziej prawdopodobne, że będzie ponownie użyć optymalizator kwerendy wykonanie planów.

C.Korzystanie z parametru WYJŚCIOWEGO

W poniższym przykładzie użyto OUTPUT parametru do przechowywania, zestaw wyników generowanych przez SELECT instrukcja w @SQLString parametru.Dwie SELECT sprawozdania są następnie wykonywane używające wartości OUTPUT parametru.

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

Dodatkowe przykłady, zobacz Using sp_executesql.