Task-Transact-SQLEXECUTE-Transact-SQL

DIESES THEMA GILT FÜR: jaSQL Server (ab 2008)jaAzure SQL-DatenbankjaAzure SQL Data Warehouse jaParallel Data Warehouse THIS TOPIC APPLIES TO: yesSQL Server (starting with 2008)yesAzure SQL DatabaseyesAzure SQL Data Warehouse yesParallel Data Warehouse

Führt eine Befehlszeichenfolge oder eine Zeichenfolge in eine Transact-SQLTransact-SQL Batch oder eines der folgenden Module: gespeicherte Systemprozedur, benutzerdefinierte gespeicherte Prozedur, gespeicherte CLR-Prozedur, benutzerdefinierte Skalarwertfunktion oder erweiterte gespeicherte Prozedur.Executes a command string or character string within a Transact-SQLTransact-SQL batch, or one of the following modules: system stored procedure, user-defined stored procedure, CLR stored procedure, scalar-valued user-defined function, or extended stored procedure. Die EXECUTE-Anweisung kann zum Senden von Pass-Through-Befehlen an Verbindungsserver verwendet werden.The EXECUTE statement can be used to send pass-through commands to linked servers. Darüber hinaus kann der Kontext, in dem eine Zeichenfolge oder ein Befehl ausgeführt wird, explizit festgelegt werden.Additionally, the context in which a string or command is executed can be explicitly set. Metadaten für das Resultset können mit den WITH RESULT SETS-Optionen definiert werden.Metadata for the result set can be defined by using the WITH RESULT SETS options.

Wichtig

Bevor Sie EXECUTE mit einer Zeichenfolge aufrufen, sollten Sie die Zeichenfolge überprüfen.Before you call EXECUTE with a character string, validate the character string. Führen Sie auf keinen Fall einen aus Benutzereingaben erstellten Befehl aus, der nicht zuvor überprüft wurde.Never execute a command constructed from user input that has not been validated.

Themenlinksymbol Transact-SQL Syntax Conventions (Transact-SQL-Syntaxkonventionen)Topic link icon Transact-SQL Syntax Conventions

SyntaxSyntax

-- Syntax for SQL Server  

Execute a stored procedure or function  
[ { EXEC | EXECUTE } ]  
    {   
      [ @return_status = ]  
      { module_name [ ;number ] | @module_name_var }   
        [ [ @parameter = ] { value   
                           | @variable [ OUTPUT ]   
                           | [ DEFAULT ]   
                           }  
        ]  
      [ ,...n ]  
      [ WITH <execute_option> [ ,...n ] ]  
    }  
[;]  

Execute a character string  
{ EXEC | EXECUTE }   
    ( { @string_variable | [ N ]'tsql_string' } [ + ...n ] )  
    [ AS { LOGIN | USER } = ' name ' ]  
[;]  

Execute a pass-through command against a linked server  
{ EXEC | EXECUTE }  
    ( { @string_variable | [ N ] 'command_string [ ? ]' } [ + ...n ]  
        [ { , { value | @variable [ OUTPUT ] } } [ ...n ] ]  
    )   
    [ AS { LOGIN | USER } = ' name ' ]  
    [ AT linked_server_name ]  
[;]  

<execute_option>::=  
{  
        RECOMPILE   
    | { RESULT SETS UNDEFINED }   
    | { RESULT SETS NONE }   
    | { RESULT SETS ( <result_sets_definition> [,...n ] ) }  
}   

<result_sets_definition> ::=   
{  
    (  
         { column_name   
           data_type   
         [ COLLATE collation_name ]   
         [ NULL | NOT NULL ] }  
         [,...n ]  
    )  
    | AS OBJECT   
        [ db_name . [ schema_name ] . | schema_name . ]   
        {table_name | view_name | table_valued_function_name }  
    | AS TYPE [ schema_name.]table_type_name  
    | AS FOR XML   
}  
-- In-Memory OLTP   

Execute a natively compiled, scalar user-defined function  
[ { EXEC | EXECUTE } ]   
    {   
      [ @return_status = ]   
      { module_name | @module_name_var }   
        [ [ @parameter = ] { value   
                           | @variable   
                           | [ DEFAULT ]   
                           }  
        ]   
      [ ,...n ]   
      [ WITH <execute_option> [ ,...n ] ]   
    }  
<execute_option>::=  
{  
    | { RESULT SETS UNDEFINED }   
    | { RESULT SETS NONE }   
    | { RESULT SETS ( <result_sets_definition> [,...n ] ) }  
}  
-- Syntax for Azure SQL Database   

Execute a stored procedure or function  
[ { EXEC | EXECUTE } ]  
    {   
      [ @return_status = ]  
      { module_name  | @module_name_var }   
        [ [ @parameter = ] { value   
                           | @variable [ OUTPUT ]   
                           | [ DEFAULT ]   
                           }  
        ]  
      [ ,...n ]  
      [ WITH RECOMPILE ]  
    }  
[;]  

Execute a character string  
{ EXEC | EXECUTE }   
    ( { @string_variable | [ N ]'tsql_string' } [ + ...n ] )  
    [ AS {  USER } = ' name ' ]  
[;]  

<execute_option>::=  
{  
        RECOMPILE   
    | { RESULT SETS UNDEFINED }   
    | { RESULT SETS NONE }   
    | { RESULT SETS ( <result_sets_definition> [,...n ] ) }  
}   

<result_sets_definition> ::=   
{  
    (  
         { column_name   
           data_type   
         [ COLLATE collation_name ]   
         [ NULL | NOT NULL ] }  
         [,...n ]  
    )  
    | AS OBJECT   
        [ db_name . [ schema_name ] . | schema_name . ]   
        {table_name | view_name | table_valued_function_name }  
    | AS TYPE [ schema_name.]table_type_name  
    | AS FOR XML  
-- Syntax for Azure SQL Data Warehouse and Parallel Data Warehouse  

-- Execute a stored procedure  
[ { EXEC | EXECUTE } ]  
    procedure_name   
        [ { value | @variable [ OUT | OUTPUT ] } ] [ ,...n ] }  
[;]  

-- Execute a SQL string  
{ EXEC | EXECUTE }  
    ( { @string_variable | [ N ] 'tsql_string' } [ +...n ] )  
[;]  

ArgumenteArguments

@return_status@return_status
Eine optionale ganzzahlige Variable, die den Rückgabestatus eines Moduls speichert.Is an optional integer variable that stores the return status of a module. Diese Variable muss im Batch, in der gespeicherten Prozedur oder in der Funktion deklariert werden, bevor sie in einer EXECUTE-Anweisung verwendet wird.This variable must be declared in the batch, stored procedure, or function before it is used in an EXECUTE statement.

Bei der Verwendung zum Aufrufen einer benutzerdefinierten Skalarwertfunktion, die @Return_status -Variable jeder skalare Datentyp möglich.When used to invoke a scalar-valued user-defined function, the @return_status variable can be of any scalar data type.

Modulnamemodule_name
Der vollqualifizierte oder nicht vollqualifizierte Name der aufzurufenden gespeicherten Prozedur oder benutzerdefinierten Skalarwertfunktion.Is the fully qualified or nonfully qualified name of the stored procedure or scalar-valued user-defined function to call. Modulnamen müssen den Regeln für entsprechen Bezeichner.Module names must comply with the rules for identifiers. Bei den Namen von erweiterten gespeicherten Prozeduren wird immer nach Groß-/Kleinschreibung unterschieden, unabhängig von der Sortierung des Servers.The names of extended stored procedures are always case-sensitive, regardless of the collation of the server.

Ein Benutzer kann ein in einer anderen Datenbank erstelltes Modul ausführen, wenn er Besitzer des Moduls ist oder die entsprechende Berechtigung dafür hat, es in dieser Datenbank auszuführen.A module that has been created in another database can be executed if the user running the module owns the module or has the appropriate permission to execute it in that database. Ein Benutzer kann ein Modul auf einem anderen Server mit SQL ServerSQL Server ausführen, wenn er die entsprechende Berechtigung besitzt, diesen Server zu verwenden (Remotezugriff) und das Modul in dieser Datenbank auszuführen.A module can be executed on another server running SQL ServerSQL Server if the user running the module has the appropriate permission to use that server (remote access) and to execute the module in that database. Wird ein Servername, aber kein Datenbankname angegeben, sucht SQL Server-DatenbankmodulSQL Server Database Engine das Modul in der Standarddatenbank des Benutzers.If a server name is specified but no database name is specified, the SQL Server-DatenbankmodulSQL Server Database Engine looks for the module in the default database of the user.

; Anzahl;number
Gilt für: SQL Server 2008SQL Server 2008 über SQL Server 2017SQL Server 2017Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017

Eine optionale ganze Zahl zum Gruppieren von Prozeduren mit dem gleichen Namen.Is an optional integer that is used to group procedures of the same name. Dieser Parameter wird nicht bei erweiterten gespeicherten Prozeduren verwendet.This parameter is not used for extended stored procedures.

Hinweis

Dieses Feature wird in einer künftigen Version von Microsoft SQL Server entfernt.This feature will be removed in a future version of Microsoft SQL Server. Verwenden Sie diese Funktion beim Entwickeln neuer Anwendungen nicht, und planen Sie das Ändern von Anwendungen, in denen es zurzeit verwendet wird.Avoid using this feature in new development work, and plan to modify applications that currently use this feature.

Weitere Informationen zu Prozedurgruppen finden Sie unter CREATE PROCEDURE ( Transact-SQL ) .For more information about procedure groups, see CREATE PROCEDURE (Transact-SQL).

@module_name_var@module_name_var
Der Name einer lokal definierten Variablen, die den Namen eines Moduls darstellt.Is the name of a locally defined variable that represents a module name.

Dies kann eine Variable sein, die den Namen des eine systemintern kompilierte, skalare benutzerdefinierte Funktion enthält.This can be a variable that holds the name of a natively compiled, scalar user-defined function.

@Parameter@parameter
Der Parameter für Modulname, wie im Modul definiert.Is the parameter for module_name, as defined in the module. Parameternamen muss das @-Zeichen vorangestellt werden.Parameter names must be preceded by the at sign (@). Bei Verwendung mit dem @Parameter_name=Wert Form, Parameternamen und Konstanten müssen nicht in der Reihenfolge angegeben werden, in dem sie im Modul definiert sind.When used with the @parameter_name=value form, parameter names and constants do not have to be supplied in the order in which they are defined in the module. Jedoch, wenn der @Parameter_name=Wert Form für die einzelnen Parameter verwendet wird, muss Sie für alle nachfolgenden Parameter verwendet werden.However, if the @parameter_name=value form is used for any parameter, it must be used for all subsequent parameters.

Für Parameter sind standardmäßig NULL-Werte zugelassen.By default, parameters are nullable.

valuevalue
Der Wert des Parameters, der an das Modul oder den Pass-Through-Befehl übergeben werden soll.Is the value of the parameter to pass to the module or pass-through command. Wenn keine Parameternamen angegeben werden, müssen die Parameterwerte in der Reihenfolge angegeben werden, in der sie im Modul definiert sind.If parameter names are not specified, parameter values must be supplied in the order defined in the module.

Wenn Sie Pass-Through-Befehle für Verbindungsserver ausführen, hängt die Reihenfolge der Parameterwerte vom OLE DB-Anbieter des Verbindungsservers ab.When executing pass-through commands against linked servers, the order of the parameter values depends on the OLE DB provider of the linked server. Die meisten OLE DB-Anbieter binden Werte von links nach rechts an Parameter.Most OLE DB providers bind values to parameters from left to right.

Wenn der Wert eines Parameters ein Objektname oder eine Zeichenfolge ist oder durch den Namen einer Datenbank oder eines Schemas qualifiziert ist, dann muss der gesamte Name in einfache Anführungszeichen eingeschlossen werden.If the value of a parameter is an object name, character string, or qualified by a database name or schema name, the whole name must be enclosed in single quotation marks. Ist der Wert eines Parameters ein Schlüsselwort, muss das Schlüsselwort in doppelte Anführungszeichen eingeschlossen werden.If the value of a parameter is a keyword, the keyword must be enclosed in double quotation marks.

Falls im Modul ein Standardwert definiert ist, kann ein Benutzer das Modul ohne Angabe von Parametern ausführen.If a default is defined in the module, a user can execute the module without specifying a parameter.

Der Standardwert kann auch NULL sein.The default can also be NULL. Im Allgemeinen gibt die Moduldefinition die Aktion an, die ausgeführt werden soll, wenn ein Parameter den Wert NULL hat.Generally, the module definition specifies the action that should be taken if a parameter value is NULL.

@Variable@variable
Die Variable, die einen Parameter oder einen Rückgabeparameter speichert.Is the variable that stores a parameter or a return parameter.

OUTPUTOUTPUT
Gibt an, dass das Modul oder die Befehlszeichenfolge einen Parameter zurückgibt.Specifies that the module or command string returns a parameter. Der entsprechende Parameter im Modul oder in der Befehlszeichenfolge muss ebenfalls mit dem OUTPUT-Schlüsselwort erstellt worden sein.The matching parameter in the module or command string must also have been created by using the keyword OUTPUT. Dieses Schlüsselwort sollte verwendet werden, wenn Cursorvariablen als Parameter verwendet werden.Use this keyword when you use cursor variables as parameters.

Wenn Wert ist definiert als OUTPUT eines Moduls für einen Verbindungsserver, alle Änderungen am entsprechenden ausgeführtParameter ausgeführt vom OLE DB-Anbieters kopiert werden an die Variable am Ende der die Ausführung des Moduls.If value is defined as OUTPUT of a module executed against a linked server, any changes to the corresponding @parameter performed by the OLE DB provider will be copied back to the variable at the end of the execution of module.

Wenn OUTPUT-Parameter verwendet werden, und die Rückgabewerte in anderen Anweisungen innerhalb des aufrufenden Batches oder Moduls verwendet wird, der Wert des Parameters muss übergeben werden als Variable, wie z. B.Parameter = @Variable .If OUTPUT parameters are being used and the intent is to use the return values in other statements within the calling batch or module, the value of the parameter must be passed as a variable, such as @parameter = @variable. Sie können ein Modul nicht mit der Angabe von OUTPUT für einen Parameter ausführen, der nicht als OUTPUT-Parameter im Modul definiert wurde.You cannot execute a module by specifying OUTPUT for a parameter that is not defined as an OUTPUT parameter in the module. Konstanten können nicht mit OUTPUT an ein Modul übergeben werden; der Rückgabeparameter erfordert einen Variablennamen.Constants cannot be passed to module by using OUTPUT; the return parameter requires a variable name. Vor dem Ausführen der Prozedur muss der Datentyp der Variablen deklariert und ihr ein Wert zugewiesen werden.The data type of the variable must be declared and a value assigned before executing the procedure.

Wenn EXECUTE für eine remote gespeicherte Prozedur verwendet wird, oder um einen Pass-Through-Befehl für einen Verbindungsserver auszuführen, können OUTPUT-Parameter nicht einen der LOB-Datentypen (Large Object) aufweisen.When EXECUTE is used against a remote stored procedure, or to execute a pass-through command against a linked server, OUTPUT parameters cannot be any one of the large object (LOB) data types.

Rückgabeparameter können von einem beliebigen Datentyp außer den LOB-Datentypen sein.Return parameters can be of any data type except the LOB data types.

DEFAULTDEFAULT
Gibt den im Modul definierten Standardwert des Parameters an.Supplies the default value of the parameter as defined in the module. Wenn das Modul einen Wert für einen Parameter erwartet, der keinen definierten Standardwert aufweist, und entweder ein Parameter fehlt oder das DEFAULT-Schlüsselwort angegeben ist, tritt ein Fehler auf.When the module expects a value for a parameter that does not have a defined default and either a parameter is missing or the DEFAULT keyword is specified, an error occurs.

@string_variable@string_variable
Der Name einer lokalen Variablen.Is the name of a local variable. @String_variable kann Char, Varchar, Nchar, oder Nvarchar -Datentyp. @string_variable can be any char, varchar, nchar, or nvarchar data type. Dazu gehören die (max) -Datentypen.These include the (max) data types.

[N] "Tsql_string"[N] 'tsql_string'
Eine konstante Zeichenfolge.Is a constant string. Tsql_string kann Nvarchar oder Varchar -Datentyp.tsql_string can be any nvarchar or varchar data type. Wenn N enthalten ist, wird die Zeichenfolge interpretiert, als Nvarchar -Datentyp.If the N is included, the string is interpreted as nvarchar data type.

AS <Context_specification >AS <context_specification>
Gibt den Kontext an, in dem die Anweisung ausgeführt wird.Specifies the context in which the statement is executed.

AnmeldungLOGIN
Gilt für: SQL Server 2008SQL Server 2008 über SQL Server 2017SQL Server 2017Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017

Gibt an, dass der Kontext, der als Identität angenommen werden soll, ein Anmeldename ist.Specifies the context to be impersonated is a login. Der Identitätswechselbereich ist der Server.The scope of impersonation is the server.

BenutzerUSER
Gibt an, dass der Kontext, der als Identität angenommen werden soll, ein Benutzer in der aktuellen Datenbank ist.Specifies the context to be impersonated is a user in the current database. Der Identitätswechselbereich ist auf die aktuelle Datenbank beschränkt.The scope of impersonation is restricted to the current database. Bei einem Kontextwechsel zu einem Datenbankbenutzer werden die Berechtigungen auf Serverebene dieses Benutzers nicht geerbt.A context switch to a database user does not inherit the server-level permissions of that user.

Wichtig

Während der Kontextwechsel zu dem Datenbankbenutzer aktiv ist, wird bei jedem Zugriffsversuch auf Ressourcen außerhalb der Datenbank für die Anweisung ein Fehler gemeldet.While the context switch to the database user is active, any attempt to access resources outside the database will cause the statement to fail. Dies schließt USE Datenbank Anweisungen, verteilte Abfragen und Abfragen, die auf einer anderen Datenbank mithilfe von drei- oder vierteiligen Bezeichnern verweisen.This includes USE database statements, distributed queries, and queries that reference another database by using three- or four-part identifiers.

"Namen"'name'
Ein gültiger Benutzer- oder Anmeldename.Is a valid user or login name. Namen muss ein Mitglied der festen Serverrolle "Sysadmin" oder als Prinzipal in vorhanden Sys. database_principals oder Sys. server_principalszugeordnet.name must be a member of the sysadmin fixed server role or exist as a principal in sys.database_principals or sys.server_principals, respectively.

Namen nicht mit ein integriertes Konto, z. B. NT AUTHORITY\LocalService, NT AUTHORITY\NetworkService oder NT AUTHORITY\LocalSystem.name cannot be a built-in account, such as NT AUTHORITY\LocalService, NT AUTHORITY\NetworkService, or NT AUTHORITY\LocalSystem.

Weitere Informationen finden Sie unter angeben eines Benutzer- oder Anmeldename weiter unten in diesem Thema.For more information, see Specifying a User or Login Name later in this topic.

[N] "Command_string"[N] 'command_string'
Eine Konstantenzeichenfolge, die den Befehl enthält, der über den Verbindungsserver übergeben werden soll.Is a constant string that contains the command to be passed through to the linked server. Wenn N enthalten ist, wird die Zeichenfolge interpretiert, als Nvarchar -Datentyp.If the N is included, the string is interpreted as nvarchar data type.

[?][?]
Gibt Parameter für die Werte, in angegeben sind der <Arg-List > von Pass-Through-Befehlen, die in EXEC('...', <arg-list>) am verwendet werden <Linkedsrv >-Anweisung.Indicates parameters for which values are supplied in the <arg-list> of pass-through commands that are used in an EXEC('…', <arg-list>) AT <linkedsrv> statement.

AM Linked_server_nameAT linked_server_name
Gilt für: SQL Server 2008SQL Server 2008 über SQL Server 2017SQL Server 2017Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017

Gibt an, dass Command_string wird Linked_server_name und Ergebnisse, sofern vorhanden, werden an den Client zurückgegeben.Specifies that command_string is executed against linked_server_name and results, if any, are returned to the client. Linked_server_name muss auf eine vorhandene Verbindungsserverdefinition auf dem lokalen Server verweisen.linked_server_name must refer to an existing linked server definition in the local server. Verbindungsserver werden mithilfe von definiert Sp_addlinkedserver.Linked servers are defined by using sp_addlinkedserver.

MIT <Execute_option >WITH <execute_option>
Mögliche Ausführungsoptionen.Possible execute options. Die RESULT SETS-Optionen können nicht in einer INSERT…EXEC-Anweisung angegeben werden.The RESULT SETS options cannot be specified in an INSERT…EXEC statement.

BegriffTerm DefinitionDefinition
RECOMPILERECOMPILE Erzwingt, dass ein neuer Abfrageplan kompiliert, verwendet und nach der Ausführung des Moduls verworfen wird.Forces a new plan to be compiled, used, and discarded after the module is executed. Falls bereits ein Abfrageplan für das Modul vorhanden ist, verbleibt dieser Plan im Cache.If there is an existing query plan for the module, this plan remains in the cache.

Verwenden Sie diese Option, wenn der von Ihnen angegebene Parameter atypisch ist oder sich die Daten erheblich geändert haben.Use this option if the parameter you are supplying is atypical or if the data has significantly changed. Diese Option wird nicht bei erweiterten gespeicherten Prozeduren verwendet.This option is not used for extended stored procedures. Es wird empfohlen, diese Option nur selten zu verwenden, da sie aufwändig ist.We recommend that you use this option sparingly because it is expensive.

Hinweis: Sie können WITH RECOMPILE nicht verwenden, wenn das Aufrufen einer gespeicherten Prozedur, die OPENDATASOURCE-Syntax verwendet.Note: You can not use WITH RECOMPILE when calling a stored procedure that uses OPENDATASOURCE syntax. Die WITH RECOMPILE-Option wird ignoriert, wenn ein vierteiliger Objektname angegeben wird.The WITH RECOMPILE option is ignored when a four-part object name is specified.

Hinweis: RECOMPILE wird bei systemintern kompilierte, skalare benutzerdefinierte Funktionen nicht unterstützt.Note: RECOMPILE is not supported with natively compiled, scalar user-defined functions. Wenn Sie neu kompilieren, verwenden Sp_recompile ( Transact-SQL ) .If you need to recompile, use sp_recompile (Transact-SQL).
RESULTSETS UNDEFINEDRESULT SETS UNDEFINED Gilt für: SQL Server 2012SQL Server 2012 über SQL Server 2017SQL Server 2017, Azure SQL-DatenbankAzure SQL Database.Applies to: SQL Server 2012SQL Server 2012 through SQL Server 2017SQL Server 2017, Azure SQL-DatenbankAzure SQL Database.

Bei dieser Option ist nicht sichergestellt, dass, und, wenn ja, welche Ergebnisse zurückgegeben werden, und es wird keine Definition bereitgestellt.This option provides no guarantee of what results, if any, will be returned, and no definition is provided. Die Anweisung wird ohne Fehler ausgeführt, wenn Ergebnisse zurückgegeben werden oder wenn keine Ergebnisse zurückgegeben werden.The statement executes without error if any results are returned or no results are returned. RESULT SETS UNDEFINED ist das Standardverhalten, wenn keine result_sets_option angegeben wird.RESULT SETS UNDEFINED is the default behavior if a result_sets_option is not provided.

Für interpretierte benutzerdefinierte Skalarfunktionen und systemintern kompilierte skalare benutzerdefinierte Funktionen, ist diese Option nicht betriebsbereit, da die Funktionen nie ein Resultset zurückgeben.For interpreted scalar user-defined functions, and natively compiled scalar user-defined functions, this option is not operational because the functions never return a result set.
RESULT SETS NONERESULT SETS NONE Gilt für: SQL Server 2012SQL Server 2012 über SQL Server 2017SQL Server 2017, Azure SQL-DatenbankAzure SQL Database.Applies to: SQL Server 2012SQL Server 2012 through SQL Server 2017SQL Server 2017, Azure SQL-DatenbankAzure SQL Database.

Stellt sicher, dass von der EXECUTE-Anweisung keine Ergebnisse zurückgegeben werden.Guarantees that the execute statement will not return any results. Wenn Ergebnisse zurückgegeben werden, wird der Batch abgebrochen.If any results are returned the batch is aborted.

Für interpretierte benutzerdefinierte Skalarfunktionen und systemintern kompilierte skalare benutzerdefinierte Funktionen, ist diese Option nicht betriebsbereit, da die Funktionen nie ein Resultset zurückgeben.For interpreted scalar user-defined functions, and natively compiled scalar user-defined functions, this option is not operational because the functions never return a result set.
<Result_sets_definition ><result_sets_definition> Gilt für: SQL Server 2012SQL Server 2012 über SQL Server 2017SQL Server 2017, Azure SQL-DatenbankAzure SQL Database.Applies to: SQL Server 2012SQL Server 2012 through SQL Server 2017SQL Server 2017, Azure SQL-DatenbankAzure SQL Database.

Stellt sicher, dass das Ergebnis wie in der result_sets_definition angegeben zurückgegeben wird.Provides a guarantee that the result will come back as specified in the result_sets_definition. Anweisungen, die mehrere Resultsets zurückgeben, bietet mehrere Result_sets_definition Abschnitte.For statements that return multiple result sets, provide multiple result_sets_definition sections. Schließen Sie jede Result_sets_definition in Klammern, getrennt durch Kommas.Enclose each result_sets_definition in parentheses, separated by commas. Weitere Informationen finden Sie unter <Result_sets_definition > Weiter unten in diesem Thema.For more information, see <result_sets_definition> later in this topic.

Diese Option immer führt zu einem Fehler für systemintern kompilierte, skalare benutzerdefinierte Funktionen auf, da die Funktionen nie ein Resultset zurückgeben.This option always results in an error for natively compiled, scalar user-defined functions because the functions never return a result set.

<Result_sets_definition > betrifft: SQL Server 2012SQL Server 2012 über SQL Server 2017SQL Server 2017, Azure SQL-DatenbankAzure SQL Database<result_sets_definition> Applies to: SQL Server 2012SQL Server 2012 through SQL Server 2017SQL Server 2017, Azure SQL-DatenbankAzure SQL Database

Beschreibt die von den ausgeführten Anweisungen zurückgegebenen Resultsets.Describes the result sets returned by the executed statements. Die Klauseln der result_sets_definition haben folgende Bedeutung:The clauses of the result_sets_definition have the following meaning

BegriffTerm DefinitionDefinition
{{

column_namecolumn_name

data_typedata_type

[ COLLATE collation_name][ COLLATE collation_name]

[NULL | NOT NULL][NULL | NOT NULL]

}}
Finden Sie in der folgenden Tabelle aus.See the table below.
db_namedb_name Der Name der Datenbank mit der Tabelle, Sicht oder Tabellenwertfunktion.The name of the database containing the table, view or table valued function.
schema_nameschema_name Der Name des Schemas, das im Besitz der Tabelle, Sicht oder Tabellenwertfunktion ist.The name of the schema owning the table, view or table valued function.
Table_name | View_name | table_valued_function_nametable_name | view_name | table_valued_function_name Gibt an, dass die zurückgegebenen Spalten den in der Tabelle, Sicht oder Tabellenwertfunktion genannten entsprechen.Specifies that the columns returned will be those specified in the table, view or table valued function named. Tabellenvariablen, temporäre Tabellen und Synonyme werden in AS-Objektsyntax nicht unterstützt.Table variables, temporary tables, and synonyms are not supported in the AS object syntax.
AS TYPE [schema_name.]table_type_nameAS TYPE [schema_name.]table_type_name Gibt an, dass die zurückgegebenen Spalten den im Tabellentyp angegebenen entsprechen.Specifies that the columns returned will be those specified in the table type.
AS FOR XMLAS FOR XML Gibt an, dass die XML-Ergebnisse aus der Anweisung oder gespeicherten Prozedur, die von der EXECUTE-Anweisung aufgerufen wird, in das Format konvertiert wird, als wären sie durch eine "SELECT ...Specifies that the XML results from the statement or stored procedure called by the EXECUTE statement will be converted into the format as though they were produced by a SELECT … FOR XML …"-Anweisung generiert worden.FOR XML … verwendet.statement. Die gesamte Formatierung aus den Typdirektiven in der ursprünglichen Anweisung werden entfernt, und die zurückgegebenen Ergebnisse werden so angezeigt, als wäre keine Typdirektive angegeben worden.All formatting from the type directives in the original statement are removed, and the results returned are as though no type directive was specified. AS FOR XML konvertiert keine tabellarischen Nicht-XML-Ergebnisse aus der ausgeführten Anweisung bzw. der gespeicherten Prozedur in XML.AS FOR XML does not convert non-XML tabular results from the executed statement or stored procedure into XML.
BegriffTerm DefinitionDefinition
column_namecolumn_name Die Namen der einzelnen Spalten.The names of each column. Wenn sich die Anzahl der Spalten vom Resultset unterscheidet, tritt ein Fehler auf, und der Batch wird abgebrochen.If the number of columns differs from the result set, an error occurs and the batch is aborted. Wenn sich der Name einer Spalte vom Resultset unterscheidet, wird der zurückgegebene Spaltenname auf den definierten Namen festgelegt.If the name of a column differs from the result set, the column name returned will be set to the name defined.
data_typedata_type Die Datentypen der einzelnen Spalten.The data types of each column. Wenn die Datentypen abweichen, wird eine implizite Konvertierung in den definierten Datentyp ausgeführt.If the data types differ, an implicit conversion to the defined data type is performed. Wenn die Konvertierung fehlschlägt, wird der Batch abgebrochenIf the conversion fails the batch is aborted
COLLATE collation_nameCOLLATE collation_name Die Sortierung der einzelnen Spalten.The collation of each column. Wenn es eine Nichtübereinstimmung bei der Sortierung gibt, wird eine implizite Sortierung versucht.If there is a collation mismatch, an implicit collation is attempted. Wenn diese fehlschlägt, wird der Batch abgebrochen.If that fails, the batch is aborted.
NULL | NOT NULLNULL | NOT NULL Die NULL-Zulässigkeit der einzelnen Spalten.The nullability of each column. Wenn die definierte NULL-Zulässigkeit NOT NULL ist, und die zurückgegebenen Daten NULLS enthalten, tritt ein Fehler auf, und der Batch wird abgebrochen.If the defined nullability is NOT NULL and the data returned contains NULLs an error occurs and the batch is aborted. Wenn dieses Element nicht angegeben ist, entspricht der Standardwert der Einstellung der Optionen ANSI_NULL_DFLT_ON und ANSI_NULL_DFLT_OFF.If not specified, the default value conforms to the setting of the ANSI_NULL_DFLT_ON and ANSI_NULL_DFLT_OFF options.

Das tatsächliche Resultset, das während der Ausführung zurückgegeben wird, kann sich vom Ergebnis unterscheiden, das mit der WITH RESULT SETS-Klausel auf eine der folgenden Arten definiert wurde: Anzahl der Resultsets, Anzahl der Spalten, Spaltenname, NULL-Zulässigkeit und Datentyp.The actual result set being returned during execution can differ from the result defined using the WITH RESULT SETS clause in one of the following ways: number of result sets, number of columns, column name, nullability, and data type. Wenn die Anzahl der Resultsets abweicht, tritt ein Fehler auf, und der Batch wird abgebrochen.If the number of result sets differs, an error occurs and the batch is aborted.

HinweiseRemarks

Parameter können angegeben werden, entweder mit Wert oder mitParameter_name=Wert.Parameters can be supplied either by using value or by using @parameter_name=value. angegeben werden. Ein Parameter ist nicht Teil einer Transaktion. Deshalb wird der Wert eines Parameters, der in einer Transaktion geändert wird, nicht wieder auf seinen ursprünglichen Wert zurückgesetzt, wenn für diese Transaktion später ein Rollback ausgeführt wird.A parameter is not part of a transaction; therefore, if a parameter is changed in a transaction that is later rolled back, the value of the parameter does not revert to its previous value. Der Wert, der an den Aufrufer zurückgegeben wird, ist immer der Wert zu dem Zeitpunkt, zu dem das Modul beendet wird.The value returned to the caller is always the value at the time the module returns.

Die Schachtelung erfolgt, wenn ein Modul ein anderes Modul aufruft oder verwalteten Code durch Verweis auf ein CLR-Modul (Common Language Runtime), einen benutzerdefinierten Typ oder ein Aggregat ausführt.Nesting occurs when one module calls another or executes managed code by referencing a common language runtime (CLR) module, user-defined type, or aggregate. Die Schachtelungsebene wird um eins erhöht, wenn das aufgerufene Modul oder der Verweis auf den verwalteten Code mit der Ausführung beginnt, und wird wieder um eins erniedrigt, wenn das aufgerufene Modul oder der Verweis auf den verwalteten Code beendet ist.The nesting level is incremented when the called module or managed code reference starts execution, and it is decremented when the called module or managed code reference has finished. Ein Überschreiten der maximal möglichen 32 Schachtelungsebenen führt zu einem Fehler der gesamten Aufrufskette.Exceeding the maximum of 32 nesting levels causes the complete calling chain to fail. Die aktuelle Schachtelungsebene wird gespeichert, der @@NESTLEVEL -Systemfunktion.The current nesting level is stored in the @@NESTLEVEL system function.

Da remote gespeicherte Prozeduren und erweiterte gespeicherte Prozeduren außerhalb des Bereichs einer Transaktion liegen (es sei denn, sie werden innerhalb einer BEGIN DISTRIBUTED TRANSACTION-Anweisung ausgegeben oder mit diversen Konfigurationsoptionen verwendet), kann für Befehle, die durch das Aufrufen solcher Prozeduren ausgeführt werden, kein Rollback ausgeführt werden.Because remote stored procedures and extended stored procedures are not within the scope of a transaction (unless issued within a BEGIN DISTRIBUTED TRANSACTION statement or when used with various configuration options), commands executed through calls to them cannot be rolled back. Weitere Informationen finden Sie unter systemgespeicherte Prozeduren ( Transact-SQL ) und BEGIN DISTRIBUTED TRANSACTION ( Transact-SQL ) .For more information, see System Stored Procedures (Transact-SQL) and BEGIN DISTRIBUTED TRANSACTION (Transact-SQL).

Wird beim Verwenden von Cursorvariablen eine Prozedur ausgeführt, die eine Cursorvariable übergibt, für die ein Cursor zugeordnet ist, tritt ein Fehler auf.When you use cursor variables, if you execute a procedure that passes in a cursor variable with a cursor allocated to it an error occurs.

Sie müssen das EXECUTE-Schlüsselwort beim Ausführen von Modulen nicht angeben, wenn es sich dabei um die erste Anweisung in einem Batch handelt.You do not have to specify the EXECUTE keyword when executing modules if the statement is the first one in a batch.

Weitere Informationen zu gespeicherten CLR-Prozeduren finden Sie unter Gespeicherte CLR-Prozeduren.For additional information specific to CLR stored procedures, see CLR Stored Procedures.

Verwenden von EXECUTE mit gespeicherten ProzedurenUsing EXECUTE with Stored Procedures

Sie müssen das EXECUTE-Schlüsselwort beim Ausführen von gespeicherten Prozeduren nicht angeben, wenn es sich dabei um die erste Anweisung in einem Batch handelt.You do not have to specify the EXECUTE keyword when you execute stored procedures when the statement is the first one in a batch.

Gespeicherte Systemprozeduren von SQL ServerSQL Server beginnen mit den Zeichen sp_. SQL ServerSQL Server system stored procedures start with the characters sp_. Sie werden physisch gespeichert, der Resource-Datenbank, logisch jedoch im Sys-Schema jeder Systemdatenbank und benutzerdefinierten Datenbank.They are physically stored in the Resource database, but logically appear in the sys schema of every system and user-defined database. Es wird empfohlen, den Namen der gespeicherten Prozedur mit dem sys-Schemanamen zu qualifizieren, wenn Sie eine gespeicherte Prozedur ausführen, entweder in einem Batch oder innerhalb eines Moduls, wie etwa eine benutzerdefinierte gespeicherte Prozedur oder Funktion.When you execute a system stored procedure, either in a batch or inside a module such as a user-defined stored procedure or function, we recommend that you qualify the stored procedure name with the sys schema name.

Erweiterte gespeicherte Systemprozeduren von SQL ServerSQL Server beginnen mit den Zeichen xp_ und sind im dbo-Schema der master-Datenbank enthalten. SQL ServerSQL Server system extended stored procedures start with the characters xp_, and these are contained in the dbo schema of the master database. Es wird empfohlen, den Namen der gespeicherten Prozedur mit master.dbo zu qualifizieren, wenn Sie eine erweiterte gespeicherte Prozedur ausführen, entweder in einem Batch oder innerhalb eines Moduls, wie etwa eine benutzerdefinierte gespeicherte Prozedur oder Funktion.When you execute a system extended stored procedure, either in a batch or inside a module such as a user-defined stored procedure or function, we recommend that you qualify the stored procedure name with master.dbo.

Es wird empfohlen, den Namen der gespeicherten Prozedur mit einem Schemanamen zu qualifizieren, wenn Sie eine benutzerdefinierte gespeicherte Prozedur ausführen, entweder in einem Batch oder innerhalb eines Moduls, wie etwa eine benutzerdefinierte gespeicherte Prozedur oder Funktion.When you execute a user-defined stored procedure, either in a batch or inside a module such as a user-defined stored procedure or function, we recommend that you qualify the stored procedure name with a schema name. Wir raten davon ab, für eine benutzerdefinierte gespeicherte Prozedur den gleichen Namen wie für eine gespeicherte Systemprozedur zu verwenden.We do not recommend that you name a user-defined stored procedure with the same name as a system stored procedure. Weitere Informationen zum Ausführen gespeicherter Prozeduren finden Sie unter Ausführen einer gespeicherten Prozedur.For more information about executing stored procedures, see Execute a Stored Procedure.

Verwenden von EXECUTE mit einer ZeichenfolgeUsing EXECUTE with a Character String

In früheren Versionen von SQL ServerSQL Server sind Zeichenfolgen auf 8.000 Bytes beschränkt.In earlier versions of SQL ServerSQL Server, character strings are limited to 8,000 bytes. Deshalb müssen lange Zeichenfolgen für die dynamische Ausführung verkettet werden.This requires concatenating large strings for dynamic execution. In SQL ServerSQL Server, varchar(max) und nvarchar(max) Datentypen, mit denen Zeichenfolgen mit bis zu 2 GB an Daten angegeben werden können.In SQL ServerSQL Server, the varchar(max) and nvarchar(max) data types can be specified that allow for character strings to be up to 2 gigabytes of data.

Eine Änderung des Datenbankkontexts dauert nur so lange, bis die jeweilige EXECUTE-Anweisung beendet ist.Changes in database context last only until the end of the EXECUTE statement. Beispielsweise lautet nach der Ausführung von EXEC in der folgenden Anweisung der Datenbankkontext master.For example, after the EXEC in this following statement is run, the database context is master.

USE master; EXEC ('USE AdventureWorks2012; SELECT BusinessEntityID, JobTitle FROM HumanResources.Employee;');  

KontextwechselContext Switching

Mithilfe der AS { LOGIN | USER } = ' name '-Klausel können Sie den Ausführungskontext einer dynamischen Anweisung wechseln.You can use the AS { LOGIN | USER } = ' name ' clause to switch the execution context of a dynamic statement. Wenn der Kontextwechsel als EXECUTE ('string') AS <context_specification> angegeben wird, ist die Dauer des Kontextwechsels auf den Bereich der ausgeführten Abfrage beschränkt.When the context switch is specified as EXECUTE ('string') AS <context_specification>, the duration of the context switch is limited to the scope of the query being executed.

Angeben eines Benutzer- oder Anmeldename Specifying a User or Login Name

Der in AS { LOGIN | USER } = ' name ' angegebene Benutzer oder Anmeldename muss als Prinzipal in sys.database_principals bzw. sys.server_principals vorhanden sein. Andernfalls wird für die Anweisung ein Fehler gemeldet.The user or login name specified in AS { LOGIN | USER } = ' name ' must exist as a principal in sys.database_principals or sys.server_principals, respectively, or the statement will fail. Zudem müssen für den Prinzipal IMPERSONATE-Berechtigungen erteilt worden sein.Additionally, IMPERSONATE permissions must be granted on the principal. Falls der Aufrufer nicht der Datenbankbesitzer oder ein Mitglied der festen Serverrolle sysadmin ist, muss der Prinzipal sogar dann vorhanden sein, wenn der Benutzer als Windows-Gruppenmitglied auf die Datenbank oder Instanz von SQL ServerSQL Server zugreift.Unless the caller is the database owner or is a member of the sysadmin fixed server role, the principal must exist even when the user is accessing the database or instance of SQL ServerSQL Server through a Windows group membership. Stellen Sie sich z. B. folgende Bedingungen vor:For example, assume the following conditions:

  • Die CompanyDomain\SQLUsers-Gruppe verfügt über Zugriff auf die Sales-Datenbank.CompanyDomain\SQLUsers group has access to the Sales database.

  • CompanyDomain\SqlUser1 ist Mitglied von SQLUsers und besitzt daher implizit Zugriff auf die Sales-Datenbank.CompanyDomain\SqlUser1 is a member of SQLUsers and, therefore, has implicit access to the Sales database.

    Obwohl CompanyDomain\SqlUser1 Zugriff auf die Datenbank über die Mitgliedschaft in der SQLUsers hat zu gruppieren, die Anweisung EXECUTE @string_variable AS USER = 'CompanyDomain\SqlUser1' schlägt fehl, da CompanyDomain\SqlUser1 als Prinzipal in der Datenbank nicht vorhanden.Although CompanyDomain\SqlUser1 has access to the database through membership in the SQLUsers group, the statement EXECUTE @string_variable AS USER = 'CompanyDomain\SqlUser1' will fail because CompanyDomain\SqlUser1 does not exist as a principal in the database.

Bewährte MethodenBest Practices

Geben Sie einen Anmeldenamen oder einen Benutzer an, der die mindestens erforderlichen Berechtigungen zum Ausführen der in der Anweisung oder im Modul definierten Vorgänge aufweist.Specify a login or user that has the least privileges required to perform the operations that are defined in the statement or module. Geben Sie z. B. keinen Anmeldenamen an, der über Berechtigungen auf Serverebene verfügt, wenn nur Berechtigungen auf Datenbankebene notwendig sind; oder geben Sie nur ein Datenbankbesitzer-Konto an, wenn diese Berechtigungen erforderlich sind.For example, do not specify a login name, which has server-level permissions, if only database-level permissions are required; or do not specify a database owner account unless those permissions are required.

BerechtigungenPermissions

Zum Ausführen der EXECUTE-Anweisung sind keine Berechtigungen erforderlich.Permissions are not required to run the EXECUTE statement. Es sind jedoch Berechtigungen für die sicherungsfähigen Elemente erforderlich, auf die in der EXECUTE-Zeichenfolge verwiesen wird.However, permissions are required on the securables that are referenced within the EXECUTE string. Wenn z. B. die Zeichenfolge eine INSERT-Anweisung enthält, benötigt der Aufrufer der EXECUTE-Anweisung die INSERT-Berechtigung für die Zieltabelle.For example, if the string contains an INSERT statement, the caller of the EXECUTE statement must have INSERT permission on the target table. Berechtigungen werden überprüft, wenn die EXECUTE-Anweisung erreicht wird, selbst wenn die EXECUTE-Anweisung innerhalb eines Moduls enthalten ist.Permissions are checked at the time EXECUTE statement is encountered, even if the EXECUTE statement is included within a module.

EXECUTE-Berechtigungen für ein Modul liegen standardmäßig beim Besitzer dieses Moduls. Der Besitzer kann die Berechtigungen an andere Benutzer übertragen.EXECUTE permissions for a module default to the owner of the module, who can transfer them to other users. Wird ein Modul ausgeführt, das eine Zeichenfolge ausführt, werden Berechtigungen im Kontext des Benutzers geprüft, der das Modul ausführt, nicht im Kontext des Benutzers, der das Modul erstellt hat.When a module is run that executes a string, permissions are checked in the context of the user who executes the module, not in the context of the user who created the module. Wenn jedoch derselbe Benutzer Besitzer des aufrufenden Moduls und des aufgerufenen Moduls ist, wird die EXECUTE-Berechtigung für das zweite Modul nicht mehr überprüft.However, if the same user owns the calling module and the module being called, EXECUTE permission checking is not performed for the second module.

Wenn das Modul auf andere Datenbankobjekte zugreift, ist die Ausführung erfolgreich, wenn Sie die EXECUTE-Berechtigung für das Modul haben und eine der folgenden Bedingungen zutrifft:If the module accesses other database objects, execution succeeds when you have EXECUTE permission on the module and one of the following is true:

  • Das Modul ist als EXECUTE AS USER oder SELF gekennzeichnet, und der Modulbesitzer besitzt die entsprechenden Berechtigungen für das Objekt, auf das verwiesen wird.The module is marked EXECUTE AS USER or SELF, and the module owner has the corresponding permissions on the referenced object. Weitere Informationen zum Identitätswechsel innerhalb eines Moduls finden Sie unter EXECUTE AS-Klausel ( Transact-SQL ) .For more information about impersonation within a module, see EXECUTE AS Clause (Transact-SQL).

  • Das Modul ist als EXECUTE AS CALLER gekennzeichnet, und Sie besitzen die entsprechenden Berechtigungen für das Objekt.The module is marked EXECUTE AS CALLER, and you have the corresponding permissions on the object.

  • Das Modul ist als EXECUTE AS gekennzeichnet User_name, und User_name verfügt über die entsprechenden Berechtigungen für das Objekt.The module is marked EXECUTE AS user_name, and user_name has the corresponding permissions on the object.

Berechtigungen für den KontextwechselContext Switching Permissions

Um EXECUTE AS für einen Anmeldenamen anzugeben, benötigt der Aufrufer IMPERSONATE-Berechtigungen für den angegebenen Anmeldenamen.To specify EXECUTE AS on a login, the caller must have IMPERSONATE permissions on the specified login name. Um EXECUTE AS für einen Datenbankbenutzer anzugeben, benötigt der Aufrufer IMPERSONATE-Berechtigungen für den angegebenen Benutzernamen.To specify EXECUTE AS on a database user, the caller must have IMPERSONATE permissions on the specified user name. Wenn kein Ausführungskontext angegeben ist oder wenn EXECUTE AS CALLER angegeben ist, sind keine IMPERSONATE-Berechtigungen erforderlich.When no execution context is specified, or EXECUTE AS CALLER is specified, IMPERSONATE permissions are not required.

BeispieleExamples

A.A. Verwenden von EXECUTE, um einen einzelnen Parameter zu übergebenUsing EXECUTE to pass a single parameter

Die gespeicherte Prozedur uspGetEmployeeManagers in der AdventureWorks2012AdventureWorks2012-Datenbank erwartet einen Parameter (@EmployeeID).The uspGetEmployeeManagers stored procedure in the AdventureWorks2012AdventureWorks2012 database expects one parameter (@EmployeeID). Die folgenden Beispiele führen die uspGetEmployeeManagers gespeicherte Prozedur mit Employee ID 6 als Parameterwert.The following examples execute the uspGetEmployeeManagers stored procedure with Employee ID 6 as its parameter value.

EXEC dbo.uspGetEmployeeManagers 6;  
GO  

Die Variable kann bei der Ausführung auch ausdrücklich benannt werden:The variable can be explicitly named in the execution:

EXEC dbo.uspGetEmployeeManagers @EmployeeID = 6;  
GO  

Im folgenden ist die erste Anweisung in einem Batch oder einer Osql oder Sqlcmd Skript EXEC ist nicht erforderlich.If the following is the first statement in a batch or an osql or sqlcmd script, EXEC is not required.

dbo.uspGetEmployeeManagers 6;  
GO  
--Or  
dbo.uspGetEmployeeManagers @EmployeeID = 6;  
GO  

B.B. Verwenden mehrerer ParameterUsing multiple parameters

Im folgenden Beispiel wird die gespeicherte Prozedur spGetWhereUsedProductID in der AdventureWorks2012AdventureWorks2012-Datenbank ausgeführt.The following example executes the spGetWhereUsedProductID stored procedure in the AdventureWorks2012AdventureWorks2012 database. Sie übergibt zwei Parameter: Der erste Parameter ist eine Produkt-ID (819), und der zweite Parameter, @CheckDate, ist ein datetime-Wert.It passes two parameters: the first parameter is a product ID (819) and the second parameter, @CheckDate, is a datetime value.

DECLARE @CheckDate datetime;  
SET @CheckDate = GETDATE();  
EXEC dbo.uspGetWhereUsedProductID 819, @CheckDate;  
GO  

C.C. Verwenden von EXECUTE 'tsql_string' mit einer VariablenUsing EXECUTE 'tsql_string' with a variable

Das folgende Beispiel zeigt, wie EXECUTE dynamisch erstellte Zeichenfolgen behandelt, die Variablen enthalten.The following example shows how EXECUTE handles dynamically built strings that contain variables. In diesem Beispiel wird der tables_cursor-Cursor erstellt, der eine Liste aller benutzerdefinierten Tabellen in der AdventureWorks2012AdventureWorks2012-Datenbank enthält. Anschließend werden mithilfe dieser Liste alle Indizes für die Tabellen neu erstellt.This example creates the tables_cursor cursor to hold a list of all user-defined tables in the AdventureWorks2012AdventureWorks2012 database, and then uses that list to rebuild all indexes on the tables.

DECLARE tables_cursor CURSOR  
   FOR  
   SELECT s.name, t.name   
   FROM sys.objects AS t  
   JOIN sys.schemas AS s ON s.schema_id = t.schema_id  
   WHERE t.type = 'U';  
OPEN tables_cursor;  
DECLARE @schemaname sysname;  
DECLARE @tablename sysname;  
FETCH NEXT FROM tables_cursor INTO @schemaname, @tablename;  
WHILE (@@FETCH_STATUS <> -1)  
BEGIN;  
   EXECUTE ('ALTER INDEX ALL ON ' + @schemaname + '.' + @tablename + ' REBUILD;');  
   FETCH NEXT FROM tables_cursor INTO @schemaname, @tablename;  
END;  
PRINT 'The indexes on all tables have been rebuilt.';  
CLOSE tables_cursor;  
DEALLOCATE tables_cursor;  
GO  

D.D. Verwenden von EXECUTE mit einer remote gespeicherten ProzedurUsing EXECUTE with a remote stored procedure

Im folgenden Beispiel wird die gespeicherte Prozedur uspGetEmployeeManagers auf dem Remoteserver SQLSERVER1 ausgeführt und der Rückgabestatus, der anzeigt, ob die Ausführung erfolgreich war oder nicht, in @retstat gespeichert.The following example executes the uspGetEmployeeManagers stored procedure on the remote server SQLSERVER1 and stores the return status that indicates success or failure in @retstat.

Gilt für: SQL Server 2008SQL Server 2008 über SQL Server 2017SQL Server 2017Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017

DECLARE @retstat int;  
EXECUTE @retstat = SQLSERVER1.AdventureWorks2012.dbo.uspGetEmployeeManagers @BusinessEntityID = 6;  

E.E. Verwenden von EXECUTE mit einer Variablen für eine gespeicherte ProzedurUsing EXECUTE with a stored procedure variable

Das folgende Beispiel erstellt eine Variable, die den Namen einer gespeicherten Prozedur darstellt.The following example creates a variable that represents a stored procedure name.

DECLARE @proc_name varchar(30);  
SET @proc_name = 'sys.sp_who';  
EXEC @proc_name;  

F.F. Verwenden von EXECUTE mit DEFAULTUsing EXECUTE with DEFAULT

Das folgende Beispiel erstellt eine gespeicherte Prozedur mit Standardwerten für den ersten und dritten Parameter.The following example creates a stored procedure with default values for the first and third parameters. Beim Ausführen der Prozedur werden diese Standardwerte für den ersten und dritten Parameter eingefügt, falls beim Aufruf kein Wert übergeben oder DEFAULT angegeben wird.When the procedure is run, these defaults are inserted for the first and third parameters when no value is passed in the call or when the default is specified. Beachten Sie, wie verschiedenartig das DEFAULT-Schlüsselwort verwendet werden kann.Note the various ways the DEFAULT keyword can be used.

IF OBJECT_ID(N'dbo.ProcTestDefaults', N'P')IS NOT NULL  
   DROP PROCEDURE dbo.ProcTestDefaults;  
GO  
-- Create the stored procedure.  
CREATE PROCEDURE dbo.ProcTestDefaults (  
@p1 smallint = 42,   
@p2 char(1),   
@p3 varchar(8) = 'CAR')  
AS   
   SET NOCOUNT ON;  
   SELECT @p1, @p2, @p3  
;  
GO  

Die gespeicherte Prozedur Proc_Test_Defaults kann in verschiedenen Kombinationen ausgeführt werden.The Proc_Test_Defaults stored procedure can be executed in many combinations.

-- Specifying a value only for one parameter (@p2).  
EXECUTE dbo.ProcTestDefaults @p2 = 'A';  
-- Specifying a value for the first two parameters.  
EXECUTE dbo.ProcTestDefaults 68, 'B';  
-- Specifying a value for all three parameters.  
EXECUTE dbo.ProcTestDefaults 68, 'C', 'House';  
-- Using the DEFAULT keyword for the first parameter.  
EXECUTE dbo.ProcTestDefaults @p1 = DEFAULT, @p2 = 'D';  
-- Specifying the parameters in an order different from the order defined in the procedure.  
EXECUTE dbo.ProcTestDefaults DEFAULT, @p3 = 'Local', @p2 = 'E';  
-- Using the DEFAULT keyword for the first and third parameters.  
EXECUTE dbo.ProcTestDefaults DEFAULT, 'H', DEFAULT;  
EXECUTE dbo.ProcTestDefaults DEFAULT, 'I', @p3 = DEFAULT;  

G.G. Verwenden von EXECUTE mit AT linked_server_nameUsing EXECUTE with AT linked_server_name

Das folgende Beispiel übergibt eine Befehlszeichenfolge an einen Remoteserver.The following example passes a command string to a remote server. Der Verbindungsserver SeattleSales wird erstellt, der auf eine andere Instanz von SQL ServerSQL Server verweist und eine DDL-Anweisung (CREATE TABLE) auf diesem Verbindungsserver ausführt.It creates a linked server SeattleSales that points to another instance of SQL ServerSQL Server and executes a DDL statement (CREATE TABLE) against that linked server.

Gilt für: SQL Server 2008SQL Server 2008 über SQL Server 2017SQL Server 2017Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017

EXEC sp_addlinkedserver 'SeattleSales', 'SQL Server'  
GO  
EXECUTE ( 'CREATE TABLE AdventureWorks2012.dbo.SalesTbl   
(SalesID int, SalesName varchar(10)) ; ' ) AT SeattleSales;  
GO  

H.H. Verwenden von EXECUTE WITH RECOMPILEUsing EXECUTE WITH RECOMPILE

Das folgende Beispiel führt die ProcTest \ Defaults gespeicherte Prozedur und erzwingt, dass ein neuer Abfrageplan kompiliert, verwendet und nach der Ausführung des Moduls verworfen.The following example executes the ProcTest\Defaults stored procedure and forces a new query plan to be compiled, used, and discarded after the module is executed.

EXECUTE dbo.Proc_Test_Defaults @p2 = 'A' WITH RECOMPILE;  
GO  

I.I. Verwenden von EXECUTE mit einer benutzerdefinierten FunktionUsing EXECUTE with a user-defined function

Im folgenden Beispiel wird die benutzerdefinierte Skalarfunktion ufnGetSalesOrderStatusText in der AdventureWorks2012AdventureWorks2012-Datenbank ausgeführt.The following example executes the ufnGetSalesOrderStatusText scalar user-defined function in the AdventureWorks2012AdventureWorks2012 database. Die @returnstatus-Variable wird zum Speichern des Werts verwendet, der von der Funktion zurückgegeben wird.It uses the variable @returnstatus to store the value returned by the function. Diese Funktion erwartet einen Eingabeparameter, @Status.The function expects one input parameter, @Status. Dies ist definiert als eine "tinyint" -Datentyp.This is defined as a tinyint data type.

DECLARE @returnstatus nvarchar(15);  
SET @returnstatus = NULL;  
EXEC @returnstatus = dbo.ufnGetSalesOrderStatusText @Status = 2;  
PRINT @returnstatus;  
GO  

J.J. Verwenden von EXECUTE zum Abfragen einer Oracle-Datenbank auf einem VerbindungsserverUsing EXECUTE to query an Oracle database on a linked server

Das folgende Beispiel führt mehrere SELECT-Anweisungen auf dem Oracle-Remoteserver aus.The following example executes several SELECT statements at the remote Oracle server. Zunächst wird der Oracle-Server als Verbindungsserver hinzugefügt und der Anmeldename für den Verbindungsserver erstellt.The example begins by adding the Oracle server as a linked server and creating linked server login.

Gilt für: SQL Server 2008SQL Server 2008 über SQL Server 2017SQL Server 2017Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017

-- Setup the linked server.  
EXEC sp_addlinkedserver    
        @server='ORACLE',  
        @srvproduct='Oracle',  
        @provider='OraOLEDB.Oracle',   
        @datasrc='ORACLE10';  

EXEC sp_addlinkedsrvlogin   
    @rmtsrvname='ORACLE',  
    @useself='false',   
    @locallogin=null,   
    @rmtuser='scott',   
    @rmtpassword='tiger';  

EXEC sp_serveroption 'ORACLE', 'rpc out', true;  
GO  

-- Execute several statements on the linked Oracle server.  
EXEC ( 'SELECT * FROM scott.emp') AT ORACLE;  
GO  
EXEC ( 'SELECT * FROM scott.emp WHERE MGR = ?', 7902) AT ORACLE;  
GO  
DECLARE @v INT;   
SET @v = 7902;  
EXEC ( 'SELECT * FROM scott.emp WHERE MGR = ?', @v) AT ORACLE;  
GO   

K.K. Verwenden von EXECUTE AS USER zum Wechseln des Kontexts zu einem anderen BenutzerUsing EXECUTE AS USER to switch context to another user

Das folgende Beispiel führt eine Transact-SQLTransact-SQL-Zeichenfolge aus, mit der eine Tabelle erstellt und die AS USER-Klausel zum Umschalten des Ausführungskontexts der Anweisung vom Aufrufer zu User1 angegeben wird.The following example executes a Transact-SQLTransact-SQL string that creates a table and specifies the AS USER clause to switch the execution context of the statement from the caller to User1. Das DatenbankmodulDatabase Engine überprüft beim Ausführen der Anweisung die Berechtigungen von User1.The DatenbankmodulDatabase Engine will check the permissions of User1 when the statement is run. User1 muss als Benutzer in der Datenbank vorhanden sein und benötigt die Berechtigung zum Erstellen von Tabellen im Sales-Schema. Andernfalls kann die Anweisung nicht ausgeführt werden.User1 must exist as a user in the database and must have permission to create tables in the Sales schema, or the statement fails.

EXECUTE ('CREATE TABLE Sales.SalesTable (SalesID int, SalesName varchar(10));')  
AS USER = 'User1';  
GO  

L.L. Verwenden eines Parameters mit EXECUTE und AT linked_server_nameUsing a parameter with EXECUTE and AT linked_server_name

Im folgenden Beispiel wird eine Befehlszeichenfolge an einen Remoteserver übergeben, indem ein Fragezeichen (?) als Platzhalter für einen Parameter verwendet wird.The following example passes a command string to a remote server by using a question mark (?) placeholder for a parameter. Im Beispiel wird zunächst ein Verbindungsserver SeattleSales erstellt, der auf eine andere Instanz von SQL ServerSQL Server verweist. Anschließend wird eine SELECT-Anweisung auf diesem Verbindungsserver ausgeführt.The example creates a linked server SeattleSales that points to another instance of SQL ServerSQL Server and executes a SELECT statement against that linked server. In der SELECT-Anweisung wird das Fragezeichen als Platzhalter für den ProductID-Parameter (952) verwendet, der hinter der Anweisung angegeben wird.The SELECT statement uses the question mark as a place holder for the ProductID parameter (952), which is provided after the statement.

Gilt für: SQL Server 2008SQL Server 2008 über SQL Server 2017SQL Server 2017Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017

-- Setup the linked server.  
EXEC sp_addlinkedserver 'SeattleSales', 'SQL Server'  
GO  
-- Execute the SELECT statement.  
EXECUTE ('SELECT ProductID, Name   
    FROM AdventureWorks2012.Production.Product  
    WHERE ProductID = ? ', 952) AT SeattleSales;  
GO  

M.M. Neudefinieren eines einzelnen Resultsets mithilfe von EXECUTEUsing EXECUTE to redefine a single result set

In einigen der vorangehenden Beispiele wurde EXEC dbo.uspGetEmployeeManagers 6; ausgeführt, und 7 Spalten wurden zurückgegeben.Some of the previous examples executed EXEC dbo.uspGetEmployeeManagers 6; which returned 7 columns. Im folgenden Beispiel wird veranschaulicht, wie mit der WITH RESULT SET-Syntax die Namen und Datentypen des zurückgebenden Resultsets geändert werden.The following example demonstrates using the WITH RESULT SET syntax to change the names and data types of the returning result set.

Gilt für: SQL Server 2012SQL Server 2012 über SQL Server 2017SQL Server 2017, Azure SQL-DatenbankAzure SQL DatabaseApplies to: SQL Server 2012SQL Server 2012 through SQL Server 2017SQL Server 2017, Azure SQL-DatenbankAzure SQL Database

EXEC uspGetEmployeeManagers 16  
WITH RESULT SETS  
(   
   ([Reporting Level] int NOT NULL,  
    [ID of Employee] int NOT NULL,  
    [Employee First Name] nvarchar(50) NOT NULL,  
    [Employee Last Name] nvarchar(50) NOT NULL,  
    [Employee ID of Manager] nvarchar(max) NOT NULL,  
    [Manager First Name] nvarchar(50) NOT NULL,  
    [Manager Last Name] nvarchar(50) NOT NULL )  
);  

N.N. Neudefinieren zweier Resultsets mithilfe von EXECUTEUsing EXECUTE to redefine a two result sets

Wenn Sie eine Anweisung ausführen, die mehr als ein Resultset zurückgibt, definieren Sie jedes erwartete Resultset.When executing a statement that returns more than one result set, define each expected result set. Im folgenden Beispiel in AdventureWorks2012AdventureWorks2012 wird eine Prozedur erstellt, die zwei Resultsets zurückgibt.The following example in AdventureWorks2012AdventureWorks2012 creates a procedure that returns two result sets. Wird die Prozedur ausgeführt wird, mithilfe der WITH RESULT SETS -Klausel und zwei resultsetdefinitionen werden angegeben, legen Sie Definitionen.Then the procedure is executed using the WITH RESULT SETS clause, and specifying two result set definitions.

Gilt für: SQL Server 2012SQL Server 2012 über SQL Server 2017SQL Server 2017, Azure SQL-DatenbankAzure SQL DatabaseApplies to: SQL Server 2012SQL Server 2012 through SQL Server 2017SQL Server 2017, Azure SQL-DatenbankAzure SQL Database

--Create the procedure  
CREATE PROC Production.ProductList @ProdName nvarchar(50)  
AS  
-- First result set  
SELECT ProductID, Name, ListPrice  
    FROM Production.Product  
    WHERE Name LIKE @ProdName;  
-- Second result set   
SELECT Name, COUNT(S.ProductID) AS NumberOfOrders  
    FROM Production.Product AS P  
    JOIN Sales.SalesOrderDetail AS S  
        ON P.ProductID  = S.ProductID   
    WHERE Name LIKE @ProdName  
    GROUP BY Name;  
GO  

-- Execute the procedure   
EXEC Production.ProductList '%tire%'  
WITH RESULT SETS   
(  
    (ProductID int,   -- first result set definition starts here  
    Name Name,  
    ListPrice money)  
    ,                 -- comma separates result set definitions  
    (Name Name,       -- second result set definition starts here  
    NumberOfOrders int)  
);  

Beispiele: Azure SQL Data WarehouseAzure SQL Data Warehouse und Parallel Data WarehouseParallel Data WarehouseExamples: Azure SQL Data WarehouseAzure SQL Data Warehouse and Parallel Data WarehouseParallel Data Warehouse

Beispiel O: grundlegende Verfahren AusführungExample O: Basic Procedure Execution

Ausführen einer gespeicherten Prozedur an:Executing a stored procedure:

EXEC proc1;  

Aufrufen einer gespeicherten Prozedur mit dem Namen, die zur Laufzeit bestimmt:Calling a stored procedure with name determined at runtime:

EXEC ('EXEC ' + @var);  

Aufrufen einer gespeicherten Prozedur von innerhalb einer gespeicherten Prozedur an:Calling a stored procedure from within a stored procedure:

CREATE sp_first AS EXEC sp_second; EXEC sp_third;  

Beispiel P: Ausführen von ZeichenfolgenExample P: Executing Strings

Ausführen einer SQL-Zeichenfolge:Executing a SQL string:

EXEC ('SELECT * FROM sys.types');  

Ausführen einer geschachtelten Zeichenfolge:Executing a nested string:

EXEC ('EXEC (''SELECT * FROM sys.types'')');  

Eine Zeichenfolgenvariable wird ausgeführt:Executing a string variable:

DECLARE @stringVar nvarchar(100);  
SET @stringVar = N'SELECT name FROM' + ' sys.sql_logins';  
EXEC (@stringVar);  

F: Beispielprozesse mit ParameternExample Q: Procedures with Parameters

Im folgenden Beispiel wird eine Prozedur mit Parametern erstellt und 3 Möglichkeiten zum Ausführen der Prozedur veranschaulicht:The following example creates a procedure with parameters and demonstrates 3 ways to execute the procedure:

-- Uses AdventureWorks  

CREATE PROC ProcWithParameters  
    @name nvarchar(50),  
@color nvarchar (15)  
AS   
SELECT ProductKey, EnglishProductName, Color FROM [dbo].[DimProduct]  
WHERE EnglishProductName LIKE @name  
AND Color = @color;  
GO  

-- Executing using positional parameters  
EXEC ProcWithParameters N'%arm%', N'Black';  
-- Executing using named parameters in order  
EXEC ProcWithParameters @name = N'%arm%', @color = N'Black';  
-- Executing using named parameters out of order  
EXEC ProcWithParameters @color = N'Black', @name = N'%arm%';  
GO  

Siehe auchSee Also

@@NESTLEVEL (Transact-SQL) @@NESTLEVEL (Transact-SQL)
DECLARE @local_variable (Transact-SQL) DECLARE @local_variable (Transact-SQL)
EXECUTE AS-Klausel (Transact-SQL) EXECUTE AS Clause (Transact-SQL)
Osql (Hilfsprogramm) osql Utility
Prinzipale (Datenbankmodul) Principals (Database Engine)
Wiederherstellen ( Transact-SQL ) REVERT (Transact-SQL)
sp_addlinkedserver (Transact-SQL) sp_addlinkedserver (Transact-SQL)
sqlcmd (Hilfsprogramm) sqlcmd Utility
SUSER_NAME ( Transact-SQL ) SUSER_NAME (Transact-SQL)
sys.database_principals (Transact-SQL) sys.database_principals (Transact-SQL)
sys.server_principals (Transact-SQL) sys.server_principals (Transact-SQL)
USER_NAME ( Transact-SQL ) USER_NAME (Transact-SQL)
OPENDATASOURCE (Transact-SQL) OPENDATASOURCE (Transact-SQL)
Benutzerdefinierte Skalarfunktionen für In-Memory-OLTPScalar User-Defined Functions for In-Memory OLTP