EXECUTE (Transact-SQL)
Gilt für:SQL ServerAzure SQL-DatenbankAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)SQL-Analyseendpunkt in Microsoft FabricWarehouse in Microsoft FabricSQL-Datenbank in Microsoft Fabric
Führt eine Befehlszeichenfolge oder eine Zeichenfolge in einem Transact-SQL-Batch oder einem der folgenden Module aus: gespeicherte Systemprozedur, benutzerdefinierte gespeicherte Prozedur, gespeicherte CLR-Prozedur, benutzerdefinierte Skalarwertfunktion oder erweiterte gespeicherte Prozedur. Die EXEC
- oder EXECUTE
-Anweisung kann verwendet werden, um Pass-Through-Befehle an verknüpfte Server zu senden. 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 mithilfe der WITH RESULT SETS
-Optionen definiert werden.
Wichtig
Bevor Sie EXECUTE
mit einer Zeichenfolge aufrufen, überprüfen Sie die Zeichenfolge. Führen Sie niemals einen Befehl aus Benutzereingaben aus, der nicht überprüft wurde.
Transact-SQL-Syntaxkonventionen
Syntax
Der folgende Codeblock zeigt die Syntax in SQL Server 2019 (15.x) und höheren Versionen. Alternativ dazu können Sie auch Syntax in SQL Server 2017 und früher verwenden.
Syntax für SQL Server 2019 und höhere Versionen.
-- 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 ]
[ AT DATA_SOURCE data_source_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
}
Der folgende Codeblock zeigt die Syntax in SQL Server 2017 (14.x) und früheren Versionen. Alternativ dazu können Sie auch Syntax in SQL Server 2019 verwenden.
Syntax für SQL Server 2017 und frühere Versionen.
-- 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
}
Syntax für 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 für Azure SQL-Datenbank.
-- 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 für Azure Synapse Analytics und 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 ] )
[ ; ]
Syntax für Microsoft Fabric.
-- Execute a stored procedure
[ { EXEC | EXECUTE } ]
procedure_name
[ { value | @variable [ OUT | OUTPUT ] } ] [ ,...n ]
[ WITH <execute_option> [ ,...n ] ] }
[ ; ]
-- Execute a SQL string
{ EXEC | EXECUTE }
( { @string_variable | [ N ] 'tsql_string' } [ +...n ] )
[ ; ]
<execute_option>::=
{
RECOMPILE
| { RESULT SETS UNDEFINED }
| { RESULT SETS NONE }
| { RESULT SETS ( <result_sets_definition> [,...n ] ) }
}
Argumente
@return_status
Eine optionale ganzzahlige Variable, die den Rückgabestatus eines Moduls speichert. Diese Variable muss im Batch, in der gespeicherten Prozedur oder funktion deklariert werden, bevor sie in einer EXECUTE
-Anweisung verwendet wird.
Bei Verwendung zum Aufrufen einer benutzerdefinierten skalaren Funktion kann die @return_status Variable einen beliebigen skalaren Datentyp aufweisen.
module_name
Der vollqualifizierte oder nicht qualifizierte Name der gespeicherten Prozedur oder der skalaren benutzerdefinierten Funktion, die aufgerufen werden soll. 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 Modul, das in einer anderen Datenbank erstellt wurde, kann ausgeführt werden, wenn der Benutzer, der das Modul ausführt, das Modul besitzt oder über die entsprechende Berechtigung zum Ausführen in dieser Datenbank verfügt. 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-Datenbank-Engine das Modul in der Standarddatenbank des Benutzers.
;number
Eine optionale ganze Zahl, die zum Gruppieren von Prozeduren mit demselben Namen verwendet wird. Dieser Parameter wird nicht für erweiterte gespeicherte Prozeduren verwendet.
Hinweis
Diese Funktion wird in einer zukünftigen Version von SQL Serverentfernt. Nutzen Sie diese Funktionen bei Neuentwicklungen nicht mehr, und planen Sie die Änderung von Anwendungen, die diese Funktion zurzeit verwenden.
Weitere Informationen zu Prozedurgruppen finden Sie unter CREATE PROCEDURE.
@module_name_var
Der Name einer lokal definierten Variablen, die einen Modulnamen darstellt.
Dies kann eine Variable sein, die den Namen einer nativ kompilierten benutzerdefinierten Skalarfunktion enthält.
@parameter
Der Parameter für module_name, wie im Modul definiert. Parameternamen müssen dem At-Zeichen (@
) vorangestellt sein. Bei Verwendung mit dem @parameter_name = Wert Formular müssen Parameternamen und Konstanten nicht in der Reihenfolge angegeben werden, in der sie im Modul definiert sind. Wenn jedoch der @parameter_name = Wert Formular für einen Beliebigen Parameter verwendet wird, muss er für alle nachfolgenden Parameter verwendet werden.
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 Parameternamen nicht angegeben werden, müssen Parameterwerte in der im Modul definierten Reihenfolge angegeben werden.
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.
Wenn Sie ein einzelnes Wort übergeben, das nicht mit @
beginnt, das nicht in Anführungszeichen eingeschlossen ist (z. B. wenn Sie @
für einen Parameternamen vergessen), wird das Wort trotz fehlender Anführungszeichen als nvarchar Zeichenfolge behandelt.
Falls im Modul ein Standardwert definiert ist, kann ein Benutzer das Modul ohne Angabe von Parametern ausführen.
Der Standardwert kann auch NULL
werden. Im Allgemeinen gibt die Moduldefinition die Aktion an, die ausgeführt werden soll, wenn ein Parameterwert NULL
ist.
@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 übereinstimmende Parameter in der Modul- oder Befehlszeichenfolge muss auch mithilfe des Schlüsselworts OUTPUT
erstellt worden sein. Dieses Schlüsselwort sollte verwendet werden, wenn Cursorvariablen als Parameter verwendet werden.
Wenn Wert als OUTPUT
eines Moduls definiert ist, das mit einem verknüpften Server ausgeführt wird, werden alle Änderungen an den entsprechenden @parameter, die vom OLE DB-Anbieter ausgeführt werden, am Ende der Ausführung des Moduls wieder in die Variable kopiert.
Wenn OUTPUT
Parameter verwendet werden und die Absicht darin besteht, die Rückgabewerte in anderen Anweisungen innerhalb des aufrufenden Batchs oder Moduls zu verwenden, muss der Wert des Parameters als Variable übergeben werden, z. B. @parameter = @variable. Sie können ein Modul nicht ausführen, indem Sie OUTPUT
für einen Parameter angeben, der nicht als OUTPUT
Parameter im Modul definiert ist. Konstanten können nicht mithilfe von OUTPUT
an modul übergeben werden; für den Rückgabeparameter ist ein Variablenname erforderlich. 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 ein Pass-Through-Befehl für einen verknüpften Server ausgeführt wird, können OUTPUT
Parameter keines der Datentypen für große Objekte (Large Object, LOB) sein.
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 schlüsselwort DEFAULT
angegeben wird, tritt ein Fehler auf.
@string_variable
Der Name einer lokalen Variablen. @string_variable können beliebige Zeichen, varchar, ncharoder nvarchar Datentyp sein. Hierzu zählen auch die (max) -Datentypen.
[N]'tsql_string'
Eine konstante Zeichenfolge.
tsql_string kann einen beliebigen nvarchar- oder varchar-Datentyp aufweisen. Wenn die N
enthalten ist, wird die Zeichenfolge als nvarchar Datentyp interpretiert.
AS context_specification
Gibt den Kontext an, in dem die Anweisung ausgeführt wird.
LOGIN
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. Ein Kontextwechsel zu einem Datenbankbenutzer erbt nicht die Berechtigungen auf Serverebene dieses Benutzers.
Wichtig
Während der Kontextwechsel zum Datenbankbenutzer aktiv ist, führt jeder Versuch, auf Ressourcen außerhalb der Datenbank zuzugreifen, zu einem Fehler der Anweisung. Dazu gehören USE <database>
Anweisungen, verteilte Abfragen und Abfragen, die auf eine andere Datenbank verweisen, indem dreiteilige oder vierteilige Bezeichner verwendet werden.
'name'
Ein gültiger Benutzer- oder Anmeldename. Das argument name muss mitglied des sysadmin festen Serverrolle sein oder als Prinzipal in sys.database_principals oder sys.server_principalsvorhanden sein.
Dieses Argument kann kein integriertes Konto sein, z. B. NT AUTHORITY\LocalService
, NT AUTHORITY\NetworkService
oder NT AUTHORITY\LocalSystem
.
Weitere Informationen finden Sie unter Angeben eines Benutzer- oder Anmeldenamens weiter unten in diesem Artikel.
[N]'command_string'
Eine konstante Zeichenfolge, die den Befehl enthält, der an den verknüpften Server übergeben werden soll. Wenn die N
enthalten ist, wird die Zeichenfolge als nvarchar Datentyp interpretiert.
[?]
Gibt Parameter an, für die Werte in der <arg-list>
von Pass-Through-Befehlen bereitgestellt werden, die in einer EXECUTE ('...', <arg-list>) AT <linkedsrv>
-Anweisung verwendet werden.
AT linked_server_name
Gibt an, dass command_string für linked_server_name ausgeführt wird und dass Ergebnisse ggf. an den 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 in einerINSERT...EXECUTE
-Anweisung nicht angegeben werden.
AT DATA_SOURCE data_source_name
Gilt für: SQL Server 2019 (15.x) und höhere Versionen.
Gibt an, dass command_string für data_source_name ausgeführt wird und dass Ergebnisse ggf. an den Client zurückgegeben werden.
data_source_name muss auf eine vorhandene EXTERNAL DATA SOURCE
Definition in der Datenbank verweisen. Es werden nur Datenquellen unterstützt, die auf SQL Server verweisen. Darüber hinaus werden für SQL Server Big Data Cluster-Datenquellen, die auf Computepool, Datenpool oder Speicherpool verweisen, unterstützt. Datenquellen werden mit CREATE EXTERNAL DATA SOURCE definiert.
WITH <execute_option>
Mögliche Ausführungsoptionen. Die
RESULT SETS
Optionen können in einerINSERT...EXECUTE
-Anweisung nicht angegeben werden.Begriff Definition RECOMPILE
Erzwingt, dass ein neuer Abfrageplan kompiliert, verwendet und nach der Ausführung des Moduls verworfen wird. Wenn 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 für erweiterte gespeicherte Prozeduren verwendet. Es wird empfohlen, diese Option sparsam zu verwenden, da sie teuer ist.
Hinweis: Sie könnenWITH RECOMPILE
nicht verwenden, wenn Sie eine gespeicherte Prozedur aufrufen, dieOPENDATASOURCE
Syntax verwendet. Die optionWITH RECOMPILE
wird ignoriert, wenn ein vierteiliger Objektname angegeben wird.
Hinweis:RECOMPILE
wird nicht mit systemeigenen kompilierten, skalaren benutzerdefinierten Funktionen unterstützt. Wenn Sie neu kompilieren müssen, verwenden Sie sp_recompile.RESULT SETS UNDEFINED
Diese Option bietet keine Garantie dafür, 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 kein result_sets_option bereitgestellt wird.
Bei interpretierten skalaren benutzerdefinierten Funktionen und nativ kompilierten skalaren benutzerdefinierten Funktionen ist diese Option nicht funktionsfähig, da die Funktionen niemals ein Resultset zurückgeben.
gilt für: SQL Server 2012 (11.x) und höhere Versionen und Azure SQL-Datenbank.RESULT SETS NONE
Garantiert, dass die EXECUTE
-Anweisung keine Ergebnisse zurückgibt. Wenn Ergebnisse zurückgegeben werden, wird der Batch abgebrochen.
Bei interpretierten skalaren benutzerdefinierten Funktionen und nativ kompilierten skalaren benutzerdefinierten Funktionen ist diese Option nicht funktionsfähig, da die Funktionen niemals ein Resultset zurückgeben.
gilt für: SQL Server 2012 (11.x) und höhere Versionen und Azure SQL-Datenbank.<result_sets_definition>
Stellt eine Garantie bereit, dass das Ergebnis wie im result_sets_definition
angegeben zurückkommt. 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 Kommas getrennt. Weitere Informationen finden Sie unter<result_sets_definition>
weiter unten in diesem Artikel.
Diese Option führt bei nativ kompilierten benutzerdefinierten Skalarfunktionen immer zu einem Fehler, da die Funktionen niemals ein Resultset zurückgeben.
gilt für: SQL Server 2012 (11.x) und höhere Versionen und Azure SQL-Datenbank.<result_sets_definition>
beschreibt die von den ausgeführten Anweisungen zurückgegebenen Resultsets. Die Klauseln derresult_sets_definition
haben die folgende Bedeutung:Begriff Definition { column_name data_type
[ COLLATE collation_name ]
[NULL | NOT NULL] }Weitere Informationen finden Sie in der folgenden Tabelle. db_name Der Name der Datenbank, die die Tabellen-, Ansichts- oder Tabellenwertfunktion enthält. schema_name Der Name des Schemas, das die Tabellen-, Ansichts- oder Tabellenwertfunktion besitzt. table_name | view_name | table_valued_function_name Gibt an, dass die zurückgegebenen Spalten die in der benannten Funktion "Tabelle", "Ansicht" oder "Tabelle" angegeben sind. Tabellenvariablen, temporäre Tabellen und Synonyme werden in der AS-Objektsyntax nicht unterstützt. AS TYPE [ schema_name. ]table_type_name Gibt an, dass die zurückgegebenen Spalten diejenigen sind, die im Tabellentyp angegeben sind. 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 werden, als ob sie von einerSELECT ... FOR XML ...
-Anweisung erstellt wurden. Alle Formatierungen aus den Typdirektiven in der ursprünglichen Anweisung werden entfernt, und die zurückgegebenen Ergebnisse sind so, als ob keine Typdirektive angegeben wurde. AS FOR XML konvertiert nicht tabellarische Ergebnisse aus der ausgeführten Anweisung oder gespeicherten Prozedur in XML.Begriff 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 eine Übereinstimmung mit der Sortierung besteht, wird versucht, eine implizite Sortierung zu verwenden. Wenn diese fehlschlägt, wird der Batch abgebrochen. NULL | NOT NULL Die NULL-Zulässigkeit der einzelnen Spalten. Wenn die definierte Nullierbarkeit NOT NULL
ist und die zurückgegebenen Daten Nullwerte enthalten, tritt ein Fehler auf, und der Batch wird abgebrochen. Wenn nicht angegeben, entspricht der Standardwert der Einstellung der optionenANSI_NULL_DFLT_ON
undANSI_NULL_DFLT_OFF
.Der tatsächliche Resultset, der während der Ausführung zurückgegeben wird, kann sich von dem ergebnis unterscheiden, das mithilfe der
WITH RESULT SETS
-Klausel definiert wurde, auf eine der folgenden Arten: Anzahl der Resultsets, Anzahl der Spalten, Spaltenname, Nullierbarkeit und Datentyp. Wenn die Anzahl der Resultsets abweicht, tritt ein Fehler auf, und der Batch wird abgebrochen.
Bemerkungen
Parameter können entweder mithilfe Werts oder mithilfe @parameter_name = Wertsbereitgestellt werden. Ein Parameter ist nicht Teil einer Transaktion; Wenn ein Parameter in einer Transaktion geändert wird, die später zurückgesetzt wird, wird der Wert des Parameters nicht auf den vorherigen Wert zurückgesetzt. 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 erhöht sich, wenn der aufgerufene Modul- oder verwaltete Codeverweis die Ausführung startet, und erhöht sich, wenn der aufgerufene Modul- oder verwaltete Codeverweis abgeschlossen 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 nicht innerhalb des Gültigkeitsbereichs einer Transaktion liegen (es sei denn, sie werden innerhalb einer BEGIN DISTRIBUTED TRANSACTION
-Anweisung oder bei Verwendung mit verschiedenen Konfigurationsoptionen ausgegeben), können Befehle, die über Aufrufe ausgeführt werden, nicht zurückgesetzt werden. Weitere Informationen finden Sie unter gespeicherten Systemprozeduren und BEGIN DISTRIBUTED TRANSACTION.
Wenn Sie Cursorvariablen verwenden, tritt ein Fehler auf, wenn Sie eine Prozedur ausführen, die eine Cursorvariable mit einem ihm zugewiesenen Cursor übergibt.
Sie müssen das schlüsselwort EXECUTE
beim Ausführen von Modulen nicht angeben, wenn die Anweisung der erste in einem Batch ist.
Weitere Informationen, die für gespeicherte CLR-Prozeduren spezifisch sind, finden Sie unter CLR Stored Procedures.
Verwenden von EXECUTE mit gespeicherten Prozeduren
Sie müssen das schlüsselwort EXECUTE
nicht angeben, wenn Sie gespeicherte Prozeduren ausführen, wenn die Anweisung der erste in einem Batch ist.
Gespeicherte Prozeduren des SQL Server-Systems beginnen mit den Zeichen sp_
. Sie werden physisch in der Ressourcendatenbankgespeichert, werden aber logisch im Sys-Schema jedes Systems und benutzerdefinierter 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.
Sql Server system extended stored procedures start with the characters xp_
, and these are contained in the dbo schema of the master
database. Wenn Sie eine erweiterte gespeicherte Systemprozedur entweder in einem Batch oder in einem Modul wie einer benutzerdefinierten gespeicherten Prozedur oder Funktion ausführen, empfehlen wir, den Namen der gespeicherten Prozedur mit master.dbo
zu qualifizieren.
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. Es wird nicht empfohlen, eine benutzerdefinierte gespeicherte Prozedur mit demselben Namen wie eine gespeicherte Systemprozedur zu benennen. Weitere Informationen zum Ausführen gespeicherter Prozeduren finden Sie unter Ausführen einer gespeicherten Prozedur.
Verwenden von EXECUTE mit einer Zeichenfolge
In SQL Server können die Datentypen varchar(max) und nvarchar(max) angegeben werden, die Zeichenfolgen mit bis zu 2 Gigabyte an Daten zulassen.
Änderungen im Datenbankkontext dauern nur bis zum Ende der EXECUTE
-Anweisung. Wenn beispielsweise die EXECUTE
in dieser folgenden Anweisung ausgeführt wird, wird der Datenbankkontext master
.
USE master;
EXECUTE ('USE AdventureWorks2022; 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 Benutzer- oder Anmeldenamens
Der in AS { LOGIN | USER } = '<name>'
angegebene Benutzer- oder Anmeldename muss als Prinzipal in sys.database_principals
bzw. sys.server_principals
vorhanden sein, oder die Anweisung schlägt fehl. Darüber hinaus müssen IMPERSONATE
Berechtigungen für den Prinzipal erteilt werden. Sofern der Aufrufer nicht der Datenbankbesitzer ist oder Mitglied des sysadmin festen Serverrolle ist, muss der Prinzipal vorhanden sein, auch wenn der Benutzer über eine Windows-Gruppenmitgliedschaft auf die Datenbank oder Instanz von SQL Server zugreift. Stellen Sie sich z. B. folgende Bedingungen vor:
CompanyDomain\SQLUsers
Gruppe hat Zugriff auf dieSales
Datenbank.CompanyDomain\SqlUser1
ist mitglied vonSQLUsers
und hat daher impliziten Zugriff auf dieSales
Datenbank.
Obwohl CompanyDomain\SqlUser1
über die Mitgliedschaft in der SQLUsers
Gruppe Zugriff auf die Datenbank hat, schlägt die Anweisung EXECUTE @string_variable AS USER = 'CompanyDomain\SqlUser1'
fehl, da 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 beispielsweise keinen Anmeldenamen an, der über Berechtigungen auf Serverebene verfügt, wenn nur Berechtigungen auf Datenbankebene erforderlich sind. Oder geben Sie kein Datenbankbesitzerkonto an, es sei denn, diese Berechtigungen sind erforderlich.
Berechtigungen
Berechtigungen sind nicht erforderlich, um die EXECUTE
-Anweisung auszuführen. Berechtigungen sind jedoch für die sicherungsfähigen Elemente erforderlich, auf die innerhalb der EXECUTE
Zeichenfolge verwiesen wird. Wenn die Zeichenfolge beispielsweise eine INSERT
-Anweisung enthält, muss der Aufrufer der EXECUTE
-Anweisung über INSERT
Berechtigung für die Zieltabelle verfügen. Berechtigungen werden beim Auftreten EXECUTE
Anweisung überprüft, auch wenn die EXECUTE
-Anweisung in einem Modul enthalten ist.
EXECUTE
Berechtigungen für ein Modul standardmäßig für den Besitzer des Moduls, der sie an andere Benutzer übertragen kann. 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 derselbe Benutzer jedoch das aufrufende Modul und das aufgerufene Modul besitzt, wird EXECUTE
Berechtigungsprüfung für das zweite Modul nicht ausgeführt.
Wenn das Modul auf andere Datenbankobjekte zugreift, ist die Ausführung erfolgreich, wenn Sie über EXECUTE
Berechtigung für das Modul verfügen und eine der folgenden Bedingungen erfüllt ist:
Das Modul ist
EXECUTE AS USER
oderEXECUTE AS SELF
gekennzeichnet, und der Modulbesitzer verfügt über die entsprechenden Berechtigungen für das referenzierte Objekt. Weitere Informationen zum Identitätswechsel in einem Modul finden Sie unter EXECUTE AS-Klausel.Das Modul ist
EXECUTE AS CALLER
markiert, und Sie verfügen über die entsprechenden Berechtigungen für das Objekt.Das Modul ist
EXECUTE AS <user_name>
gekennzeichnet, und<user_name>
verfügt über die entsprechenden Berechtigungen für das Objekt.
Berechtigungen zum Wechseln von Kontexten
Um EXECUTE AS
für eine Anmeldung anzugeben, muss der Aufrufer über IMPERSONATE
Berechtigungen für den angegebenen Anmeldenamen verfügen. Um EXECUTE AS
für einen Datenbankbenutzer anzugeben, muss der Aufrufer über IMPERSONATE
Berechtigungen für den angegebenen Benutzernamen verfügen. Wenn kein Ausführungskontext angegeben oder EXECUTE AS CALLER
angegeben wird, sind IMPERSONATE
Berechtigungen nicht erforderlich.
Beispiele: SQL Server
Die Transact-SQL Codebeispiele in diesem Artikel verwenden die AdventureWorks2022
- oder AdventureWorksDW2022
Beispieldatenbank, die Sie von der Microsoft SQL Server Samples and Community Projects Homepage herunterladen können.
A. Verwenden von EXECUTE zum Übergeben eines einzelnen Parameters
Die gespeicherte Prozedur uspGetEmployeeManagers
in der AdventureWorks2022-Datenbank erwartet einen Parameter (@EmployeeID
). In den folgenden Beispielen wird die gespeicherte Prozedur uspGetEmployeeManagers
mit Employee ID 6
als zugehörigem Parameterwert ausgeführt.
EXECUTE dbo.uspGetEmployeeManagers 6;
GO
Die Variable kann bei der Ausführung auch ausdrücklich benannt werden:
EXECUTE dbo.uspGetEmployeeManagers @EmployeeID = 6;
GO
Wenn es sich bei der folgenden Anweisung um die erste Anweisung in einem Batch oder einem sqlcmd Skript handelt, ist EXECUTE
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 AdventureWorks2022-Datenbank ausgeführt. Er übergibt zwei Parameter: der erste Parameter ist eine Produkt-ID (819
) und der zweite Parameter @CheckDate
ist ein datetime Wert.
DECLARE @CheckDate AS DATETIME;
SET @CheckDate = GETDATE();
EXECUTE 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 AdventureWorks2022
-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
INNER JOIN sys.schemas AS s ON s.schema_id = t.schema_id
WHERE t.type = 'U';
OPEN tables_cursor;
DECLARE @schemaname AS sysname;
DECLARE @tablename AS 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;
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.
DECLARE @retstat AS INT;
EXECUTE
@retstat = SQLSERVER1.AdventureWorks2022.dbo.uspGetEmployeeManagers
@BusinessEntityID = 6;
E. Verwenden von EXECUTE mit einer variablen gespeicherten Prozedur
Das folgende Beispiel erstellt eine Variable, die den Namen einer gespeicherten Prozedur darstellt.
DECLARE @proc_name AS VARCHAR (30);
SET @proc_name = 'sys.sp_who';
EXECUTE @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.
EXECUTE sp_addlinkedserver 'SeattleSales', 'SQL Server';
GO
EXECUTE ('CREATE TABLE AdventureWorks2022.dbo.SalesTbl
(SalesID INT, SalesName VARCHAR(10)); ') AT SeattleSales;
GO
H. VERWENDEN VON EXECUTE WITH RECOMPILE
Im folgenden Beispiel wird die gespeicherte Prozedur Proc_Test_Defaults
ausgeführt und erzwungen, 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 AdventureWorks2022-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
. Dieser ist als Datentyp tinyint definiert.
DECLARE @returnstatus AS NVARCHAR (15);
SET @returnstatus = NULL;
EXECUTE
@returnstatus = dbo.ufnGetSalesOrderStatusText
@Status = 2;
PRINT @returnstatus;
GO
J. Verwenden von EXECUTE zum Abfragen einer Oracle-Datenbank auf einem verknüpften Server
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.
-- Setup the linked server.
EXECUTE sp_addlinkedserver
@server = 'ORACLE',
@srvproduct = 'Oracle',
@provider = 'OraOLEDB.Oracle',
@datasrc = 'ORACLE10';
EXECUTE sp_addlinkedsrvlogin
@rmtsrvname = 'ORACLE',
@useself = 'false',
@locallogin = NULL,
@rmtuser = 'scott',
@rmtpassword = 'tiger';
EXECUTE sp_serveroption 'ORACLE', 'rpc out', true;
GO
-- Execute several statements on the linked Oracle server.
EXECUTE ('SELECT * FROM scott.emp') AT ORACLE;
GO
EXECUTE ('SELECT * FROM scott.emp WHERE MGR = ?', 7902) AT ORACLE;
GO
DECLARE @v AS INT;
SET @v = 7902;
EXECUTE ('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, die eine Tabelle erstellt und die AS USER
-Klausel zum Umschalten des Ausführungskontexts der Anweisung vom Aufrufer zu User1
angibt. Das Datenbankmodul überprüft die Berechtigungen von User1
, wenn die Anweisung ausgeführt wird.
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.
-- Setup the linked server.
EXECUTE sp_addlinkedserver 'SeattleSales', 'SQL Server';
GO
-- Execute the SELECT statement.
EXECUTE ('SELECT ProductID, Name
FROM AdventureWorks2022.Production.Product
WHERE ProductID = ? ', 952) AT SeattleSales;
GO
M. Verwenden von EXECUTE zum Neudefinieren eines einzelnen Resultsets
gilt für: SQL Server 2012 (11.x) und höhere Versionen und Azure SQL-Datenbank.
Einige der vorherigen Beispiele wurden EXECUTE dbo.uspGetEmployeeManagers 6;
ausgeführt, die sieben Spalten zurückgegeben haben. Im folgenden Beispiel wird veranschaulicht, wie mit der WITH RESULT SET
-Syntax die Namen und Datentypen des zurückgebenden Resultsets geändert werden.
EXECUTE 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. Verwenden von EXECUTE zum Neudefinieren von zwei Resultsets
gilt für: SQL Server 2012 (11.x) und höhere Versionen und Azure SQL-Datenbank.
Wenn Sie eine Anweisung ausführen, die mehr als ein Resultset zurückgibt, definieren Sie jedes erwartete Resultset. Im folgenden Beispiel in AdventureWorks2022
wird eine Prozedur erstellt, die zwei Resultsets zurückgibt. Anschließend wird die Prozedur mithilfe der WITH RESULT SETS
-Klausel ausgeführt und zwei Resultsetdefinitionen angegeben.
--Create the procedure
CREATE PROCEDURE 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
INNER JOIN Sales.SalesOrderDetail AS S
ON P.ProductID = S.ProductID
WHERE Name LIKE @ProdName
GROUP BY Name;
GO
-- Execute the procedure
EXECUTE Production.ProductList '%tire%' WITH RESULT SETS
(
-- first result set definition starts here
(ProductID INT,
[Name] NAME,
ListPrice MONEY)
-- comma separates result set definitions
,
-- second result set definition starts here
([Name] NAME,
NumberOfOrders INT)
);
O. Verwenden von EXECUTE mit AT DATA_SOURCE data_source_name zum Abfragen eines SQL Server-Remoteservers
Gilt für: SQL Server 2019 (15.x) und höhere Versionen.
Im folgenden Beispiel wird eine Befehlszeichenfolge an eine externe Datenquelle weitergeleitet, die auf eine SQL Server-Instanz verweist.
EXECUTE ( 'SELECT @@SERVERNAME' ) AT DATA_SOURCE my_sql_server;
GO
P. Verwenden von EXECUTE mit AT DATA_SOURCE data_source_name zum Abfragen des Computepools in SQL Server Big Data Cluster
Gilt für: SQL Server 2019 (15.x).
Im folgenden Beispiel wird eine Befehlszeichenfolge an eine externe Datenquelle weitergeleitet, die auf einen Computepool in einem Big Data-Cluster für SQL Server verweist. Im Beispiel wird eine Datenquelle SqlComputePool
für einen Computepool in einem Big Data-Cluster für SQL Server erstellt und eine SELECT
-Anweisung für die Datenquelle ausgeführt.
CREATE EXTERNAL DATA SOURCE SqlComputePool
WITH (LOCATION = 'sqlcomputepool://controller-svc/default');
EXECUTE ('SELECT @@SERVERNAME') AT DATA_SOURCE SqlComputePool;
GO
Q. Verwenden von EXECUTE mit AT DATA_SOURCE data_source_name zum Abfragen des Datenpools in SQL Server Big Data Cluster
Gilt für: SQL Server 2019 (15.x).
Im folgenden Beispiel wird eine Befehlszeichenfolge an eine externe Datenquelle übergeben, die auf den Computepool in SQL Server Big Data Cluster (BDC) verweist. Im Beispiel wird eine Datenquelle SqlDataPool
für einen Datenpool in BDC erstellt und eine SELECT
-Anweisung für die Datenquelle ausgeführt.
CREATE EXTERNAL DATA SOURCE SqlDataPool
WITH (LOCATION = 'sqldatapool://controller-svc/default');
EXECUTE ('SELECT @@SERVERNAME') AT DATA_SOURCE SqlDataPool;
GO
R. Verwenden von EXECUTE mit AT DATA_SOURCE data_source_name zum Abfragen des Speicherpools in SQL Server Big Data Cluster
Gilt für: SQL Server 2019 (15.x).
Im folgenden Beispiel wird eine Befehlszeichenfolge an eine externe Datenquelle weitergeleitet, die auf einen Computepool in einem Big Data-Cluster für SQL Server verweist. Im Beispiel wird eine Datenquelle SqlStoragePool
für einen Datenpool in einem Big Data-Cluster für SQL Server erstellt und eine SELECT
-Anweisung für die Datenquelle ausgeführt.
CREATE EXTERNAL DATA SOURCE SqlStoragePool
WITH (LOCATION = 'sqlhdfs://controller-svc/default');
EXECUTE ('SELECT @@SERVERNAME') AT DATA_SOURCE SqlStoragePool;
GO
Beispiele: Azure Synapse Analytics
Die Transact-SQL Codebeispiele in diesem Artikel verwenden die AdventureWorks2022
- oder AdventureWorksDW2022
Beispieldatenbank, die Sie von der Microsoft SQL Server Samples and Community Projects Homepage herunterladen können.
A: Grundlegende Prozedurausführung
Ausführen einer gespeicherten Prozedur:
EXECUTE proc1;
Rufen Sie eine gespeicherte Prozedur mit dem Namen auf, der zur Laufzeit bestimmt wird:
EXECUTE ('EXECUTE ' + @var);
Aufrufen einer gespeicherten Prozedur aus einer gespeicherten Prozedur:
CREATE sp_first AS EXECUTE sp_second; EXECUTE sp_third;
B: Ausführen von Zeichenfolgen
Ausführen einer SQL-Zeichenfolge:
EXECUTE ('SELECT * FROM sys.types');
Führen Sie eine geschachtelte Zeichenfolge aus:
EXECUTE ('EXECUTE (''SELECT * FROM sys.types'')');
Ausführen einer Zeichenfolgenvariable:
DECLARE @stringVar AS NVARCHAR (100);
SET @stringVar = N'SELECT name FROM' + ' sys.sql_logins';
EXECUTE (@stringVar);
C: Prozeduren mit Parametern
Im folgenden Beispiel wird eine Prozedur mit Parametern erstellt und drei Möglichkeiten zum Ausführen der Prozedur veranschaulicht:
CREATE PROCEDURE ProcWithParameters (
@name NVARCHAR (50),
@color NVARCHAR (15)
)
AS
SELECT ProductKey,
EnglishProductName,
Color
FROM [dbo].[DimProduct]
WHERE EnglishProductName LIKE @namef
AND Color = @color;
GO
Wird mithilfe von Positionsparametern ausgeführt:
EXECUTE ProcWithParameters N'%arm%', N'Black';
Führen Sie die Ausführung mit benannten Parametern in der folgenden Reihenfolge aus:
EXECUTE ProcWithParameters
@name = N'%arm%',
@color = N'Black';
Ausführen mit benannten Parametern außerhalb der Reihenfolge:
EXECUTE ProcWithParameters
@color = N'Black',
@name = N'%arm%';
GO
Verwandte Inhalte
- @@NESTLEVEL (Transact-SQL)
- DECLARE @local_variable (Transact-SQL)
- EXECUTE AS-Klausel (Transact-SQL)
- osql (Hilfsprogramm)
- Prinzipale (Datenbank-Engine)
- REVERT (Transact-SQL)
- sp_addlinkedserver (Transact-SQL)
- SQLCMD-Hilfsprogramm
- SUSER_NAME (Transact-SQL)
- sys.database_principals (Transact-SQL)
- sys.server_principals (Transact-SQL)
- USER_NAME (Transact-SQL)
- OPENDATASOURCE (Transact-SQL)
- Benutzerdefinierte Skalarfunktionen für In-Memory-OLTP