Ausführen von gespeicherten Prozeduren (Datenbankmodul)

Wenn Sie eine gespeicherte Prozedur ausführen möchten, verwenden Sie die EXECUTE-Anweisung von Transact-SQL. Sie können eine gespeicherte Prozedur auch ohne das EXECUTE-Schlüsselwort ausführen, wenn die gespeicherte Prozedur die erste Anweisung im Batch ist.

Ausführen von gespeicherten Systemprozeduren

Gespeicherte Systemprozeduren beginnen mit der Zeichenfolge sp_. Sie werden physisch in der Ressourcendatenbank gespeichert, logisch jedoch im sys-Schema jeder system- und benutzerdefinierten Datenbank in der Instanz von SQL Server angezeigt. Gespeicherte Systemprozeduren können von jeder Datenbank aus ausgeführt werden, ohne dass der vollqualifizierte Name der gespeicherten Prozedur angegeben werden muss. Ein nicht schemaqualifizierter Name ist entweder ein einteiliger Name wie sp_someproc oder ein dreiteiliger Name wie somedb..sp_someproc, bei dem der zweite Teil, also der Schemaname, nicht angegeben ist.

Es wird empfohlen, die Namen aller gespeicherten Systemprozeduren mit dem sys-Schemanamen für das Schema zu qualifizieren, um Namenskonflikte zu vermeiden. Das folgende Beispiel zeigt die empfohlene Methode für das Ausführen einer gespeicherten Systemprozedur.

EXEC sys.sp_who;

Das folgende Beispiel zeigt abwärtskompatible Methoden für das Ausführen gespeicherter Systemprozeduren.

HinweisHinweis

Die folgenden Methoden zum Ausführen gespeicherter Systemprozeduren werden aus einer zukünftigen Version von SQL Server entfernt. Vermeiden Sie die Verwendung dieser Methoden beim Entwickeln neuer Anwendungen, und planen Sie die Änderung von Anwendungen, in denen sie aktuell verwendet werden.

EXEC sp_who;
EXEC master.dbo.sp_who;
EXEC mydatabase..sp_who;
EXEC dbo.sp_who;
EXEC mydatabase.dbo.sp_who;

Datenbanksortierungs-Zuordnung

SQL Server 2008 verwendet die Sortierung der aufrufenden Datenbank, wenn die Namen der Systemprozeduren zugeordnet werden.Aus diesem Grund sollten Sie immer die genaue Groß- und Kleinschreibung bei den Namen von Systemprozeduren in Ihrer Anwendung verwenden. Der folgende Code erzeugt z. B. einen Fehler, wenn er im Kontext einer Datenbank ausgeführt wird, die Sortierung mit Unterscheidung von Groß- und Kleinschreibung verwendet:

exec SP_heLP; -- Will fail to resolve because SP_heLP does not equal sp_help 

Verwenden Sie die sys.system_objects- und sys.system_parameters-Katalogsichten, um die genauen Namen der gespeicherten Systemprozeduren anzuzeigen.

Ausführen von erweiterten gespeicherten Systemprozeduren

Erweiterte gespeicherte Systemprozeduren beginnen mit der Zeichenfolge xp_. Sie werden physisch in der Ressourcendatenbank gespeichert, logisch jedoch im sys-Schema jeder system- und benutzerdefinierten Datenbank in der Instanz von SQL Server angezeigt. Das folgende Beispiel zeigt die empfohlene Methode für das Ausführen einer erweiterten gespeicherten Systemprozedur.

EXEC sys.xp_subdirs 'c:\';

Ausführen von benutzerdefinierten gespeicherten Prozeduren

Beim Ausführen einer benutzerdefinierten gespeicherten Prozedur (entweder in einem Batch oder in einem Modul wie z. B. einer benutzerdefinierten gespeicherten Prozedur oder Funktion) wird unbedingt empfohlen, den Namen der gespeicherten Prozedur mindestens mit dem Schemanamen zu qualifizieren.

Das folgende Beispiel zeigt die empfohlene Methode für das Ausführen einer benutzerdefinierten gespeicherten Prozedur.

USE AdventureWorks;
GO
EXEC dbo.uspGetEmployeeManagers 50;

Oder:

EXEC AdventureWorks.dbo.uspGetEmployeeManagers 50;
GO

Wird ein nicht gekennzeichneter Name einer benutzerdefinierten gespeicherten Prozedur angegeben, durchsucht Database Engine (Datenbankmodul) die folgenden Schemas in der angegebenen Reihenfolge nach der Prozedur:

  • im sys-Schema der aktuellen Datenbank,

  • Das Standardschema des Aufrufers wird als Batch oder als dynamisches SQL ausgeführt. Falls aber der Name der nicht qualifizierten Prozedur im Hauptteil einer anderen Prozedurdefinition vorkommt, wird als nächstes das Schema gesucht, das diese andere Prozedur enthält. Weitere Informationen zu Standardschemas finden Sie unter Trennung von Benutzer und Schema.

  • Im dbo-Schema der aktuellen Datenbank.

Wichtiger HinweisWichtig

Wenn eine benutzerdefinierte gespeicherte Prozedur denselben Namen aufweist wie eine gespeicherte Systemprozedur, wird die benutzerdefinierte gespeicherte Prozedur nie ausgeführt, wenn Sie einen nicht schemaqualifizierten Verweisnamen verwenden. Weitere Informationen finden Sie unter Erstellen von gespeicherten Prozeduren (Datenbankmodul).

Angeben von Parametern

Parameterwerte können angegeben werden, wenn durch die Prozedurdefinition festgelegt wurde, dass die gespeicherte Prozedur Parameter annimmt.

Der angegebene Wert muss eine Konstante oder eine Variable sein; Sie können keinen Funktionsnamen als Parameterwert angeben. Variablen können benutzerdefiniert oder Systemvariablen (z. B. @@spid) sein.

Die folgenden Beispiele zeigen das Übergeben von Parameterwerten an die gespeicherte Prozedur uspGetWhereUsedProductID. Die Prozedur erwartet Werte für zwei Eingabeparameter: eine Produkt-ID und ein Datum. Die Beispiele zeigen, wie Parameter als Konstanten und Variablen übergeben werden, sowie die Verwendung einer Variablen, um den Wert einer Funktion zu übergeben.

USE AdventureWorks;
GO
-- Passing values as constants.
EXEC dbo.uspGetWhereUsedProductID 819, '20050225';
GO
-- Passing values as variables.
DECLARE @ProductID int, @CheckDate datetime;
SET @ProductID = 819;
SET @CheckDate = '20050225';
EXEC dbo.uspGetWhereUsedProductID @ProductID, @CheckDate;
GO
-- Try to use a function as a parameter value.
-- This produces an error message.
EXEC dbo.uspGetWhereUsedProductID 819, GETDATE();
GO
-- Passing the function value as a variable.
DECLARE @CheckDate datetime;
SET @CheckDate = GETDATE();
EXEC dbo.uspGetWhereUsedProductID 819, @CheckDate;
GO

Wenn Sie die Parameter in einer anderen Reihenfolge angeben möchten als in der Reihenfolge, mit der sie in der gespeicherten Prozedur definiert sind, müssen Sie sie benennen. Weitere Informationen finden Sie unter Angeben eines Parameternamens.

Wenn Sie angeben möchten, dass ein Parameter einen Wert an das aufrufende Programm zurückgeben soll, verwenden Sie das OUTPUT-Schlüsselwort. Weitere Informationen finden Sie unter Angeben der Richtung eines Parameters.

Angeben der Reihenfolge der Parameter

Wenn Sie Parameter in der Form **@parameter =**value bereitstellen, können Sie diese in beliebiger Reihenfolge angeben. Sie können zudem Parameter auslassen, für die Standardwerte angegeben wurden. Wenn Sie einen Parameter in der Form **@parameter =**value angeben, müssen Sie alle nachfolgenden Parameter auf diese Weise angeben. Wenn Sie die Parameter nicht in der Form **@parameter =**value bereitstellen, müssen Sie die Parameter in derselben Reihenfolge angeben, die in der CREATE PROCEDURE-Anweisung verwendet wurde.

Beim Ausführen einer gespeicherten Prozedur weist der Server alle Parameter zurück, die während der Prozedurerstellung nicht in die Parameterliste aufgenommen wurden. Parameter aus einer Verweisübergabe (durch explizites Übergeben des Parameternamens), werden nicht angenommen, wenn der Parametername nicht übereinstimmt.

Verwenden von Standardwerten in Parametern

Sie können Parameter auslassen, für die Standardwerte angegeben wurden; dies ist jedoch nur durch Abschneiden der Parameterliste möglich. Wenn eine gespeicherte Prozedur beispielsweise über fünf Parameter verfügt, können Sie den vierten und den fünften Parameter auslassen; es ist jedoch nicht möglich, den vierten Parameter auszulassen und den fünften weiterhin anzugeben, es sei denn, Sie geben die Parameter in der Form **@parameter =**value an.

Der Standardwert eines Parameters, falls ein solcher Wert für den Parameter in der gespeicherten Prozedur definiert ist, wird unter folgenden Umständen verwendet:

  • Für den Parameter ist kein Wert angegeben, wenn die gespeicherte Prozedur ausgeführt wird.

  • Das DEFAULT-Schlüsselwort ist als Wert für den Parameter angegeben.