War diese Seite hilfreich?
Ihr Feedback ist uns wichtig. Teilen Sie uns Ihre Meinung mit.
Weiteres Feedback?
1500 verbleibende Zeichen
Exportieren (0) Drucken
Alle erweitern
Dieser Artikel wurde manuell übersetzt. Bewegen Sie den Mauszeiger über die Sätze im Artikel, um den Originaltext anzuzeigen. Weitere Informationen
Übersetzung
Original

EXECUTE (Transact-SQL)

Führt eine Befehlszeichenfolge oder eine Zeichenfolge in einem Transact-SQL-Batch oder eines der folgenden Module aus: gespeicherte Systemprozedur, benutzerdefinierte gespeicherte CLR-Prozedur, benutzerdefinierte Skalarwertfunktion oder eine erweiterte gespeicherte Prozedur. Die EXECUTE-Anweisung kann zum Senden von Pass-Through-Befehlen an Verbindungsserver verwendet werden. Darüber hinaus kann der Kontext, in dem eine Zeichenfolge oder ein Befehl ausgeführt wird, explizit festgelegt werden. Metadaten für das Resultset können mit den WITH RESULT SETS-Optionen definiert werden.

Sicherheitshinweis Sicherheitshinweis

Bevor Sie EXECUTE mit einer Zeichenfolge aufrufen, sollten Sie die Zeichenfolge überprüfen. Führen Sie auf keinen Fall einen aus Benutzereingaben erstellten Befehl aus, der nicht zuvor überprüft wurde.

Gilt für: SQL Server (SQL Server 2008 bis aktuelle Version), Windows Azure SQL-Datenbank (Ursprüngliche Version bis aktuelle Version).

Themenlink (Symbol) Transact-SQL-Syntaxkonventionen

-- SQL Server Syntax

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 
}
-- Windows 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 

@return_status

Eine optionale ganzzahlige Variable, die den Rückgabestatus eines Moduls speichert. Diese Variable muss im Batch, in der gespeicherten Prozedur oder in der Funktion deklariert werden, bevor sie in einer EXECUTE-Anweisung verwendet wird.

Bei der Verwendung zum Aufrufen einer benutzerdefinierten Skalarwertfunktion ist für die @return_status-Variable jeder skalare Datentyp möglich.

module_name

Der vollqualifizierte oder nicht vollqualifizierte Name der aufzurufenden gespeicherten Prozedur oder benutzerdefinierten Skalarwertfunktion. Modulnamen müssen den Regeln für Bezeichner entsprechen. Bei den Namen von erweiterten gespeicherten Prozeduren wird immer nach Groß-/Kleinschreibung unterschieden, unabhängig von der Sortierung des Servers.

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. Ein Benutzer kann ein Modul auf einem anderen Server mit SQL Server ausführen, wenn er die entsprechende Berechtigung besitzt, diesen Server zu verwenden (Remotezugriff) und das Modul in dieser Datenbank auszuführen. Wird ein Servername, aber kein Datenbankname angegeben, sucht SQL Server Database Engine (Datenbankmodul) das Modul in der Standarddatenbank des Benutzers.

;number

Gilt für: SQL Server 2008 bis SQL Server 2014.

Eine optionale ganze Zahl zum Gruppieren von Prozeduren mit dem gleichen Namen. Dieser Parameter wird nicht bei erweiterten gespeicherten Prozeduren verwendet.

Hinweis Hinweis

Diese Funktion wird in zukünftigen Versionen von Microsoft SQL Server nicht mehr bereitgestellt. Verwenden Sie diese Funktion beim Entwickeln neuer Anwendungen nicht, und planen Sie das Ändern von Anwendungen, in denen es zurzeit verwendet wird.

Weitere Informationen zu Prozedurgruppen finden Sie unter CREATE PROCEDURE (Transact-SQL).

@module_name_var

Der Name einer lokal definierten Variablen, die den Namen eines Moduls darstellt.

@parameter

Der Parameter für module_name, wie er im Modul definiert ist. Parameternamen muss das @-Zeichen vorangestellt werden. Wird das Format @parameter_name=value verwendet, müssen Parameternamen und Konstanten nicht in der Reihenfolge angegeben werden, wie sie im Modul definiert sind. Wenn jedoch das Format @parameter_name=value für einen Parameter verwendet wird, dann ist dies auch für alle nachfolgenden Parameter erforderlich.

Für Parameter sind standardmäßig NULL-Werte zugelassen.

value

Der Wert des Parameters, der an das Modul oder den Pass-Through-Befehl übergeben werden soll. Wenn keine Parameternamen angegeben werden, müssen die Parameterwerte in der Reihenfolge angegeben werden, in der sie im Modul definiert sind.

Wenn Sie Pass-Through-Befehle für Verbindungsserver ausführen, hängt die Reihenfolge der Parameterwerte vom OLE DB-Anbieter des Verbindungsservers ab. Die meisten OLE DB-Anbieter binden Werte von links nach rechts an Parameter.

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. Ist der Wert eines Parameters ein Schlüsselwort, muss das Schlüsselwort in doppelte Anführungszeichen eingeschlossen werden.

Falls im Modul ein Standardwert definiert ist, kann ein Benutzer das Modul ohne Angabe von Parametern ausführen.

Der Standardwert kann auch NULL sein. Im Allgemeinen gibt die Moduldefinition die Aktion an, die ausgeführt werden soll, wenn ein Parameter den Wert NULL hat.

@variable

Die Variable, die einen Parameter oder einen Rückgabeparameter speichert.

OUTPUT

Gibt an, dass das Modul oder die Befehlszeichenfolge einen Parameter zurückgibt. Der entsprechende Parameter im Modul oder in der Befehlszeichenfolge muss ebenfalls mit dem OUTPUT-Schlüsselwort erstellt worden sein. Dieses Schlüsselwort sollte verwendet werden, wenn Cursorvariablen als Parameter verwendet werden.

Wenn value als OUTPUT eines Moduls definiert ist, das für einen Verbindungsserver ausgeführt wird, werden alle vom OLE DB-Anbieter vorgenommenen Änderungen am entsprechenden @parameter am Ende der Ausführung des Moduls an die Variable zurückkopiert.

Wenn OUTPUT-Parameter verwendet werden und die Rückgabewerte in anderen Anweisungen innerhalb des aufrufenden Batches oder Moduls verwendet werden sollen, dann muss der Wert des Parameters als Variable übergeben werden (d. h., im Format @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. Konstanten können nicht mit OUTPUT an ein Modul übergeben werden; der Rückgabeparameter erfordert einen Variablennamen. Vor dem Ausführen der Prozedur muss der Datentyp der Variablen deklariert und ihr ein Wert zugewiesen werden.

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.

Rückgabeparameter können von einem beliebigen Datentyp außer den LOB-Datentypen sein.

DEFAULT

Gibt den im Modul definierten Standardwert des Parameters an. 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.

@string_variable

Der Name einer lokalen Variablen. @string_variable kann ein beliebiger char-, varchar-, nchar oder nvarchar-Datentyp sein. Hierzu zählen auch die Datentypen (max).

[N] 'tsql_string'

Eine konstante Zeichenfolge. tsql_string kann ein beliebiger nvarchar- oder varchar-Datentyp sein. Wird das N angegeben, wird die Zeichenfolge als Datentyp nvarchar interpretiert.

AS <context_specification>

Gibt den Kontext an, in dem die Anweisung ausgeführt wird.

LOGIN

Gilt für: SQL Server 2008 bis SQL Server 2014.

Gibt an, dass der Kontext, der als Identität angenommen werden soll, ein Anmeldename ist. Der Identitätswechselbereich ist der Server.

USER

Gibt an, dass der Kontext, der als Identität angenommen werden soll, ein Benutzer in der aktuellen Datenbank ist. Der Identitätswechselbereich ist auf die aktuelle Datenbank beschränkt. Bei einem Kontextwechsel zu einem Datenbankbenutzer werden die Berechtigungen auf Serverebene dieses Benutzers nicht geerbt.

Wichtiger Hinweis 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. Hierzu zählen USE database-Anweisungen, verteilte Abfragen und Abfragen, die auf eine andere Datenbank mithilfe von drei- und vierteiligen Bezeichnern verweisen.

'name'

Ein gültiger Benutzer- oder Anmeldename. name muss ein Mitglied der festen Serverrolle sysadmin sein oder als Prinzipal in sys.database_principals bzw. sys.server_principals vorhanden sein.

name kann kein integriertes Konto sein, wie z. B. NT AUTHORITY\LocalService, NT AUTHORITY\NetworkService oder NT AUTHORITY\LocalSystem.

Weitere Informationen finden Sie unter Angeben eines Benutzers oder eines Anmeldenamens weiter unten in diesem Thema.

[N] 'command_string'

Eine Konstantenzeichenfolge, die den Befehl enthält, der über den Verbindungsserver übergeben werden soll . Wird das N angegeben, wird die Zeichenfolge als Datentyp nvarchar interpretiert.

[?]

Gibt Parameter an, deren Werte im <arg-list>-Parameter von Pass-Through-Befehlen bereitgestellt werden, die in einer EXEC('…', <arg-list>) AT <linkedsrv>-Anweisung verwendet werden.

AT linked_server_name

Gilt für: SQL Server 2008 bis SQL Server 2014.

Gibt an, dass command_string für linked_server_name ausgeführt wird und dass Ergebnisse, falls vorhanden, am Client zurückgegeben werden. linked_server_name muss auf die Definition eines vorhandenen Verbindungsservers auf dem lokalen Server verweisen. Verbindungsserver werden mithilfe von sp_addlinkedserver definiert.

WITH <execute_option>

Mögliche Ausführungsoptionen. Die RESULT SETS-Optionen können nicht in einer INSERT…EXEC-Anweisung angegeben werden.

Benennung

Definition

RECOMPILE

Erzwingt, dass ein neuer Abfrageplan kompiliert, verwendet und nach der Ausführung des Moduls verworfen wird. Falls bereits ein Abfrageplan für das Modul vorhanden ist, verbleibt dieser Plan im Cache.

Verwenden Sie diese Option, wenn der von Ihnen angegebene Parameter atypisch ist oder sich die Daten erheblich geändert haben. Diese Option wird nicht bei erweiterten gespeicherten Prozeduren verwendet. Es wird empfohlen, diese Option nur selten zu verwenden, da sie aufwändig ist.

Hinweis Hinweis

Sie können WITH RECOMPILE nicht verwenden, wenn Sie eine gespeicherte Prozedur aufrufen, die OPENDATASOURCE-Syntax verwendet. Die WITH RECOMPILE-Option wird ignoriert, wenn ein vierteiliger Objektname angegeben wird.

RESULT SETS UNDEFINED

Betrifft: SQL Server 2012 bis SQL Server 2014, Windows Azure SQL-Datenbank.

Bei dieser Option ist nicht sichergestellt, dass, und, wenn ja, welche Ergebnisse zurückgegeben werden, und es wird keine Definition bereitgestellt. Die Anweisung wird ohne Fehler ausgeführt, wenn Ergebnisse zurückgegeben werden oder wenn keine Ergebnisse zurückgegeben werden. RESULT SETS UNDEFINED ist das Standardverhalten, wenn keine result_sets_option angegeben wird.

RESULT SETS NONE

Betrifft: SQL Server 2012 bis SQL Server 2014, Windows Azure SQL-Datenbank.

Stellt sicher, dass von der EXECUTE-Anweisung keine Ergebnisse zurückgegeben werden. Wenn Ergebnisse zurückgegeben werden, wird der Batch abgebrochen.

<result_sets_definition>

Betrifft: SQL Server 2012 bis SQL Server 2014, Windows Azure SQL-Datenbank.

Stellt sicher, dass das Ergebnis wie in der result_sets_definition angegeben zurückgegeben wird. Stellen Sie mehrere result_sets_definition-Abschnitte für Anweisungen bereit, die mehrere Resultsets zurückgeben. Schließen Sie jede result_sets_definition in Klammern ein, jeweils durch Trennzeichen getrennt. Weitere Informationen finden Sie unter <result_sets_definition> weiter unten in diesem Thema.

<result_sets_definition>

Betrifft: SQL Server 2012 bis SQL Server 2014, Windows Azure SQL-Datenbank.

Beschreibt die von den ausgeführten Anweisungen zurückgegebenen Resultsets. Die Klauseln der result_sets_definition haben folgende Bedeutung:

Benennung

Definition

{

    column_name

    data_type

    [ COLLATE collation_name]

    [NULL | NOT NULL]

}

Benennung

Definition

column_name

Die Namen der einzelnen Spalten. Wenn sich die Anzahl der Spalten vom Resultset unterscheidet, tritt ein Fehler auf, und der Batch wird abgebrochen. Wenn sich der Name einer Spalte vom Resultset unterscheidet, wird der zurückgegebene Spaltenname auf den definierten Namen festgelegt.

data_type

Die Datentypen der einzelnen Spalten. Wenn die Datentypen abweichen, wird eine implizite Konvertierung in den definierten Datentyp ausgeführt. Wenn die Konvertierung fehlschlägt, wird der Batch abgebrochen

COLLATE collation_name

Die Sortierung der einzelnen Spalten. Wenn es eine Nichtübereinstimmung bei der Sortierung gibt, wird eine implizite Sortierung versucht. Wenn diese fehlschlägt, wird der Batch abgebrochen.

NULL | NOT NULL

Die NULL-Zulässigkeit der einzelnen Spalten. 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. Wenn dieses Element nicht angegeben ist, entspricht der Standardwert der Einstellung der Optionen ANSI_NULL_DFLT_ON und ANSI_NULL_DFLT_OFF.

db_name

Der Name der Datenbank mit der Tabelle, Sicht oder Tabellenwertfunktion.

schema_name

Der Name des Schemas, das im Besitz der Tabelle, Sicht oder Tabellenwertfunktion ist.

table_name | view_name | table_valued_function_name

Gibt an, dass die zurückgegebenen Spalten den in der Tabelle, Sicht oder Tabellenwertfunktion genannten entsprechen. Tabellenvariablen, temporäre Tabellen und Synonyme werden in AS-Objektsyntax nicht unterstützt.

AS TYPE [schema_name.]table_type_name

Gibt an, dass die zurückgegebenen Spalten den im Tabellentyp angegebenen entsprechen.

AS 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... FOR XML ..."-Anweisung generiert worden. 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. AS FOR XML konvertiert keine tabellarischen Nicht-XML-Ergebnisse aus der ausgeführten Anweisung bzw. der gespeicherten Prozedur in XML.

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. Wenn die Anzahl der Resultsets abweicht, tritt ein Fehler auf, und der Batch wird abgebrochen.

Parameter können mithilfe von value oder @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. Der Wert, der an den Aufrufer zurückgegeben wird, ist immer der Wert zu dem Zeitpunkt, zu dem das Modul beendet wird.

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. 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. Ein Überschreiten der maximal möglichen 32 Schachtelungsebenen führt zu einem Fehler der gesamten Aufrufskette. Die aktuelle Schachtelungsebene wird in der @@NESTLEVEL-Systemfunktion gespeichert.

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. Weitere Informationen finden Sie unter Gespeicherte Systemprozeduren (Transact-SQL) und 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.

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.

Weitere Informationen zu gespeicherten CLR-Prozeduren finden Sie unter Gespeicherte CLR-Prozeduren.

Verwenden von EXECUTE mit gespeicherten Prozeduren

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.

Gespeicherte Systemprozeduren von SQL Server beginnen mit den Zeichen sp_. Sie werden physisch in der Ressourcendatenbank gespeichert, werden aber logisch sys-Schema jeder Systemdatenbank und benutzerdefinierten Datenbank angezeigt. 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.

Erweiterte gespeicherte Systemprozeduren von SQL Server beginnen mit den Zeichen xp_, und sind im dbo-Schema der master-Datenbank enthalten. 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.

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. Wir raten davon ab, für eine benutzerdefinierte gespeicherte Prozedur den gleichen Namen wie für eine gespeicherte Systemprozedur zu verwenden. Weitere Informationen zum Ausführen gespeicherter Prozeduren finden Sie unter Ausführen einer gespeicherten Prozedur.

Verwenden von EXECUTE mit einer Zeichenfolge

In früheren Versionen von SQL Server sind Zeichenfolgen auf 8.000 Bytes beschränkt. Deshalb müssen lange Zeichenfolgen für die dynamische Ausführung verkettet werden. In SQL Server können die Datentypen varchar(max) und nvarchar(max) angegeben werden, die Zeichenfolgen mit bis zu 2 GB an Daten zulassen.

Eine Änderung des Datenbankkontexts dauert nur so lange, bis die jeweilige EXECUTE-Anweisung beendet ist. Beispielsweise lautet nach der Ausführung von EXEC in der folgenden Anweisung der Datenbankkontext master.

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

Kontextwechsel

Mithilfe der AS { LOGIN | USER } = ' name '-Klausel können Sie den Ausführungskontext einer dynamischen Anweisung wechseln. 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.

Angeben eines Benutzers oder eines Anmeldenamens

Der in AS { LOGIN | USER } = ' name ' angegebene Benutzer oder Anmeldename muss als Prinzipal in sys.database_principals bzw. sys.server_principals enthalten sein, oder die Anweisung erzeugt einen Fehler. Darüber hinaus müssen dem Prinzipal IMPERSONATE-Berechtigungen erteilt werden. 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 Server zugreift. Stellen Sie sich z. B. folgende Bedingungen vor:

  • Die CompanyDomain\SQLUsers-Gruppe hat Zugriff auf die Sales-Datenbank.

  • CompanyDomain\SqlUser1 ist Mitglied von SQLUsers und verfügt daher über impliziten Zugriff auf die Sales-Datenbank.

Obwohl CompanyDomain\SqlUser1 über die Mitgliedschaft in der SQLUsers-Gruppe Zugriff auf die Datenbank hat, wird für die Anweisung EXECUTE @string_variable AS USER = 'CompanyDomain\SqlUser1' ein Fehler gemeldet, weil CompanyDomain\SqlUser1 nicht als Prinzipal in der Datenbank vorhanden ist.

Bewährte Methoden

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

Zum Ausführen der EXECUTE-Anweisung sind keine Berechtigungen erforderlich. Es sind jedoch Berechtigungen für die sicherungsfähigen Elemente erforderlich, auf die in der EXECUTE-Zeichenfolge verwiesen wird. Wenn z. B. die Zeichenfolge eine INSERT-Anweisung enthält, benötigt der Aufrufer der EXECUTE-Anweisung die INSERT-Berechtigung für die Zieltabelle. Berechtigungen werden überprüft, wenn die EXECUTE-Anweisung erreicht wird, selbst wenn die EXECUTE-Anweisung innerhalb eines Moduls enthalten ist.

EXECUTE-Berechtigungen für ein Modul liegen standardmäßig beim Besitzer dieses Moduls. Der Besitzer kann die Berechtigungen an andere Benutzer übertragen. 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. 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.

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:

  • 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. Weitere Informationen zum Identitätswechsel innerhalb eines Moduls finden Sie unter EXECUTE AS-Klausel (Transact-SQL).

  • Das Modul ist als EXECUTE AS CALLER gekennzeichnet, und Sie besitzen die entsprechenden Berechtigungen für das Objekt.

  • Das Modul ist als EXECUTE AS user_name gekennzeichnet, und user_name besitzt die entsprechenden Berechtigungen für das Objekt.

Berechtigungen für den Kontextwechsel

Um EXECUTE AS für einen Anmeldenamen anzugeben, benötigt der Aufrufer IMPERSONATE-Berechtigungen für den angegebenen Anmeldenamen. Um EXECUTE AS für einen Datenbankbenutzer anzugeben, benötigt der Aufrufer IMPERSONATE-Berechtigungen für den angegebenen Benutzernamen. Wenn kein Ausführungskontext angegeben ist oder wenn EXECUTE AS CALLER angegeben ist, sind keine IMPERSONATE-Berechtigungen erforderlich.

A.Verwenden von EXECUTE, um einen einzelnen Parameter zu übergeben

Die gespeicherte Prozedur uspGetEmployeeManagers in der AdventureWorks2012-Datenbank erwartet einen Parameter (@EmployeeID). Die folgenden Beispiele führen die gespeicherte Prozedur uspGetEmployeeManagers mit Employee ID 6 als Parameterwert aus.

EXEC dbo.uspGetEmployeeManagers 6;
GO

Die Variable kann bei der Ausführung auch ausdrücklich benannt werden:

EXEC dbo.uspGetEmployeeManagers @EmployeeID = 6;
GO

Falls es sich bei der folgenden Anweisung um die erste Anweisung in einem Batch oder in einem osql- oder sqlcmd-Skript handelt, ist die Angabe von EXEC nicht erforderlich.

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

B.Verwenden mehrerer Parameter

Im folgenden Beispiel wird die gespeicherte Prozedur spGetWhereUsedProductID in der AdventureWorks2012-Datenbank ausgeführt. Sie übergibt zwei Parameter: Der erste Parameter ist eine Produkt-ID (819), und der zweite Parameter, @CheckDate, ist ein datetime-Wert.

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

C.Verwenden von EXECUTE 'tsql_string' mit einer Variablen

Das folgende Beispiel zeigt, wie EXECUTE dynamisch erstellte Zeichenfolgen behandelt, die Variablen enthalten. In diesem Beispiel wird der tables_cursor-Cursor erstellt, der eine Liste aller benutzerdefinierten Tabellen in der AdventureWorks2012 -Datenbank enthält. Anschließend werden mithilfe dieser Liste alle Indizes für die Tabellen neu erstellt.

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.Verwenden von EXECUTE mit einer remote gespeicherten Prozedur

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.

Gilt für: SQL Server 2008 bis SQL Server 2014.

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

E.Verwenden von EXECUTE mit einer Variablen für eine gespeicherte Prozedur

Das folgende Beispiel erstellt eine Variable, die den Namen einer gespeicherten Prozedur darstellt.

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

F.Verwenden von EXECUTE mit DEFAULT

Das folgende Beispiel erstellt eine gespeicherte Prozedur mit Standardwerten für den ersten und dritten Parameter. 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. Beachten Sie, wie verschiedenartig das DEFAULT-Schlüsselwort verwendet werden kann.

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.

-- 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.Verwenden von EXECUTE mit AT linked_server_name

Das folgende Beispiel übergibt eine Befehlszeichenfolge an einen Remoteserver. Der Verbindungsserver SeattleSales wird erstellt, der auf eine andere Instanz von SQL Server verweist und eine DDL-Anweisung (CREATE TABLE) auf diesem Verbindungsserver ausführt.

Gilt für: SQL Server 2008 bis SQL Server 2014.

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

H.Verwenden von EXECUTE WITH RECOMPILE

Das folgende Beispiel führt die gespeicherte Prozedur Proc_Test_Defaults aus und erzwingt, dass ein neuer Abfrageplan kompiliert, verwendet und nach der Ausführung des Moduls verworfen wird.

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

I.Verwenden von EXECUTE mit einer benutzerdefinierten Funktion

Im folgenden Beispiel wird die benutzerdefinierte Skalarfunktion ufnGetSalesOrderStatusText in der AdventureWorks2012-Datenbank ausgeführt. Die @returnstatus-Variable wird zum Speichern des Werts verwendet, der von der Funktion zurückgegeben wird. Diese Funktion erwartet einen Eingabeparameter, @Status. Für diesen ist der Datentyp tinyint definiert.

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

J.Verwenden von EXECUTE zum Abfragen einer Oracle-Datenbank auf einem Verbindungsserver

Das folgende Beispiel führt mehrere SELECT-Anweisungen auf dem Oracle-Remoteserver aus. Zunächst wird der Oracle-Server als Verbindungsserver hinzugefügt und der Anmeldename für den Verbindungsserver erstellt.

Gilt für: SQL Server 2008 bis SQL Server 2014.

-- 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.Verwenden von EXECUTE AS USER zum Wechseln des Kontexts zu einem anderen Benutzer

Das folgende Beispiel führt eine Transact-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. Das Database Engine (Datenbankmodul) überprüft beim Ausführen der Anweisung die Berechtigungen von User1. 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.

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

L.Verwenden eines Parameters mit EXECUTE und 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. Im Beispiel wird zunächst ein Verbindungsserver SeattleSales erstellt, der auf eine andere Instanz von SQL Server verweist. Anschließend wird eine SELECT-Anweisung auf diesem Verbindungsserver ausgeführt. In der SELECT-Anweisung wird das Fragezeichen als Platzhalter für den ProductID-Parameter (952) verwendet, der hinter der Anweisung angegeben wird.

Gilt für: SQL Server 2008 bis SQL Server 2014.

-- 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.Neudefinieren eines einzelnen Resultsets mithilfe von EXECUTE

In einigen der vorangehenden Beispiele wurde EXEC dbo.uspGetEmployeeManagers 6; ausgeführt, und 7 Spalten wurden zurückgegeben. Im folgenden Beispiel wird veranschaulicht, wie mit der WITH RESULT SET-Syntax die Namen und Datentypen des zurückgebenden Resultsets geändert werden.

Betrifft: SQL Server 2012 bis SQL Server 2014, Windows Azure SQL-Datenbank.

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.Neudefinieren zweier Resultsets mithilfe von EXECUTE

Wenn Sie eine Anweisung ausführen, die mehr als ein Resultset zurückgibt, definieren Sie jedes erwartete Resultset. Im folgenden Beispiel in AdventureWorks2012 wird eine Prozedur erstellt, die zwei Resultsets zurückgibt. Anschließend wird die Prozedur mit der WITH RESULT SETS-Klausel ausgeführt, und zwei Resultsetdefinitionen werden angegeben.

Betrifft: SQL Server 2012 bis SQL Server 2014, Windows Azure SQL-Datenbank.

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

Community-Beiträge

HINZUFÜGEN
Anzeigen:
© 2015 Microsoft