Eine gespeicherte Prozedur ist eine Gruppe von SQL-Anweisungen, die zu einer kompiliert werden. Gespeicherte Prozeduren können Geschäftslogik und andere Programmierkonstrukte enthalten.
In SQL Server ist eine gespeicherte Prozedur eine Gruppe von einer oder mehreren Transact-SQL-Anweisungen oder ein Verweis auf eine CLR-Methode (Common Runtime Language) von Microsoft .NET Framework.
Programmierbarkeit
Aber eine gespeicherte Prozedur ist mehr als nur ein langes Skript. Es ist ein Skript, das in SQL Server speziell unter den Stored Procedures gespeichert wurde Knoten, und es kann:
- Eingabeparameter akzeptieren (und mehrere Werte in Form von Ausgabeparametern an das aufrufende Programm zurückgeben).
- Enthalten Programmieranweisungen.
- Gibt einen Statuswert an ein aufrufendes Programm zurück, um Erfolg oder Misserfolg und den Grund für jeden Misserfolg anzuzeigen.
Gespeicherte Prozeduren enthalten häufig Geschäftslogik. Beispielsweise kann eine gespeicherte Prozedur Parameter akzeptieren, die ihr übergeben werden, und diese Parameter mit IF
testen Aussagen. Wenn der Parameter beispielsweise ein Wert ist, tun Sie dies, wenn es sich um einen anderen Wert handelt, tun Sie das.
Gespeicherte Prozeduren können die Leistung in einer Anwendung verbessern, da die gespeicherte Prozedur gleich nach ihrer Erstellung analysiert und optimiert und dann im Arbeitsspeicher gespeichert wird. Das Ausführen einer bedingten Abfrage über eine gespeicherte Prozedur kann extrem schnell sein - im Vergleich zu einer Anwendung, die eine Abfrage über das Netzwerk an den SQL Server sendet und dann alle Daten über das Netzwerk zurückgibt, damit sie sie filtern und auswählen kann nur die Datensätze, an denen es interessiert ist.
Vorteile gespeicherter Prozeduren
Hier sind einige der Hauptvorteile bei der Verwendung gespeicherter Prozeduren:
Vorteil | Erklärung |
---|---|
Modulare Programmierung | Sie können eine gespeicherte Prozedur einmal schreiben und sie dann immer wieder von verschiedenen Teilen einer Anwendung (und sogar von mehreren Anwendungen) aufrufen. |
Leistung | Gespeicherte Prozeduren ermöglichen eine schnellere Codeausführung und reduzieren den Netzwerkverkehr.
|
Sicherheit | Benutzer können eine gespeicherte Prozedur ausführen, ohne eine der Anweisungen direkt ausführen zu müssen. Daher kann eine gespeicherte Prozedur erweiterte Datenbankfunktionen für Benutzer bereitstellen, die normalerweise keinen Zugriff auf diese Aufgaben haben, aber diese Funktionen werden streng kontrolliert zur Verfügung gestellt. |
So erstellen Sie eine gespeicherte Prozedur
Um eine gespeicherte Prozedur zu erstellen, verwenden Sie CREATE PROCEDURE
-Anweisung, gefolgt von dem Code, aus dem die gespeicherte Prozedur besteht. Wenn Ihre gespeicherte Prozedur Parameter akzeptiert, müssen sie nach dem Namen eingefügt werden.
CREATE PROCEDURE myStoredProcedure AS ... OR CREATE PROCEDURE myStoredProcedure @ParameterName DataType AS ...
Wir erstellen jetzt eine gespeicherte Prozedur basierend auf einer der zuvor erstellten Ansichten – den RecentAlbums ansehen.
Diese Ansicht enthält alle Alben, die in den letzten 20 Jahren veröffentlicht wurden. Das ist in Ordnung, solange man immer nur 20 Jahre zurückblicken muss. Aber was ist, wenn Sie möchten, dass der Benutzer wählt, wie viele Jahre es abdecken soll?
Eine gespeicherte Prozedur kann dieses Problem lösen.
Wir erstellen eine gespeicherte Prozedur, die einen Parameter akzeptiert. Der Wert des Parameters ist die Anzahl der Jahre, über die zurückgesucht werden soll. Daher kann dieser Wert vom Benutzer immer dann angegeben werden, wenn er die gespeicherte Prozedur ausführt.
-
Entwerfen Sie die gespeicherte Prozedur
Öffnen Sie ein neues Abfragefenster und fügen Sie den Code für die gespeicherte Prozedur hinzu.
In unserem Fall kopieren wir den Code aus den RecentArtists und fügen ihn ein Zeigen Sie den oberen Teil an und ändern Sie ihn, sodass er zu einer gespeicherten Prozedur wird.
Wir fügen einen Parameter namens
@Count
hinzu das bestimmt, wie viele Jahre die gespeicherte Prozedur zurückblicken soll.Also ersetzen wir den fest codierten Wert von
20
mit@Count
Beispielcode
Hier ist der Code aus unserem Beispiel:
CREATE PROCEDURE spRecentAlbums @Count int AS SELECT Albums.ReleaseDate, Albums.AlbumName, Genres.Genre, Artists.ArtistName, Artists.ActiveFrom FROM Albums INNER JOIN Artists ON Albums.ArtistId = Artists.ArtistId INNER JOIN Genres ON Albums.GenreId = Genres.GenreId WHERE (Albums.ReleaseDate > DATEADD(year, - @Count, GETDATE()));
-
Erstellen Sie die gespeicherte Prozedur
Sobald alles gut aussieht, können Sie die Anweisung ausführen, um die gespeicherte Prozedur zu erstellen.
Klicken Sie auf Ausführen um die gespeicherte Prozedur zu erstellen.
Sobald die gespeicherte Prozedur erstellt wurde, können Sie sie im Objekt-Explorer sehen (möglicherweise müssen Sie die Datei Stored Procedures aktualisieren Knoten zuerst).
-
Führen Sie die gespeicherte Prozedur aus
Nachdem sie erstellt wurde, können Sie die gespeicherte Prozedur ausführen.
Öffnen Sie ein neues Abfragefenster, fügen Sie Folgendes hinzu:
EXEC spRecentAlbums @Count = 5;
Klicken Sie nun auf Ausführen aus der Symbolleiste.
Die gespeicherte Prozedur gibt alle Alben zurück, die in den letzten 5 Jahren veröffentlicht wurden.
-
Verschiedene Parameter ausprobieren
Versuchen Sie, den Wert des Parameters zu ändern, um zu sehen, wie sich dies auf die Ergebnisse auswirkt.
Sie können auch mehrere Anweisungen nacheinander ausführen. Für jede Anweisung wird ein neuer Ergebnisbereich angezeigt.
Vorlage für gespeicherte Prozeduren
In SQL Server 2016 können Sie eine gespeicherte Prozedur erstellen, indem Sie mit der rechten Maustaste auf Stored Procedures klicken Knoten im Objekt-Explorer und wählen Sie Neu> Gespeicherte Prozedur... oder New> Natively Compiled Stored Procedure... .
Dadurch wird eine Vorlage geöffnet, die bereit ist, mit Ihrem eigenen spezifischen Verfahren ausgefüllt zu werden.
Führen Sie eine gespeicherte Prozedur über die GUI aus
Sie können auch die grafische Benutzeroberfläche verwenden, um eine gespeicherte Prozedur auszuführen.
-
Starten Sie die Execute Procedure Dialogfeld
Klicken Sie im Objekt-Explorer mit der rechten Maustaste auf die gespeicherte Prozedur und wählen Sie Execute Stored Procedure... .
-
Lieferparameter
Geben Sie einen Wert für alle Parameter ein, die die gespeicherte Prozedur erfordert, und klicken Sie dann auf OK .
-
Die Ergebnisse
Die Ergebnisse werden angezeigt.
Ändern einer gespeicherten Prozedur
Wenn Sie eine vorhandene gespeicherte Prozedur ändern müssen, ersetzen Sie einfach CREATE
mit ALTER
(zusammen mit dem aktualisierten Verfahren).
In diesem Beispiel wird die gespeicherte Prozedur so geändert, dass die Ergebnisse nach Veröffentlichungsdatum in absteigender Reihenfolge sortiert werden:
ALTER PROCEDURE spRecentAlbums @Count int AS SELECT Albums.ReleaseDate, Albums.AlbumName, Genres.Genre, Artists.ArtistName, Artists.ActiveFrom FROM Albums INNER JOIN Artists ON Albums.ArtistId = Artists.ArtistId INNER JOIN Genres ON Albums.GenreId = Genres.GenreId WHERE (Albums.ReleaseDate > DATEADD(year, - @Count, GETDATE())) ORDER BY Albums.ReleaseDate DESC;
Gespeicherte Systemprozeduren
SQL Server enthält eine große Anzahl gespeicherter Systemprozeduren zur Unterstützung von Datenbankverwaltungsaufgaben. Viele der Aufgaben, die Sie über die GUI ausführen können, können über eine gespeicherte Systemprozedur ausgeführt werden. Einige der Dinge, die Sie mit gespeicherten Systemprozeduren tun können, sind zum Beispiel:
- Sicherheitskonten konfigurieren
- Verbindungsserver einrichten
- Erstellen Sie einen Wartungsplan für die Datenbank
- Kataloge für die Volltextsuche erstellen
- Remote-Login hinzufügen
- Replikation konfigurieren
- Geplante Jobs einrichten
- und vieles mehr...
Gespeicherte Systemprozeduren haben das Präfix sp_ , daher sollten Sie dieses Präfix am besten nicht für Ihre eigenen Prozeduren verwenden.
Namenskonventionen
Es ist eine gute Idee, eine konsistente Namenskonvention für Ihre gespeicherten Prozeduren (und für alle anderen Objekte in Ihrer Datenbank) zu entwickeln.
Einige Leute stellen ihren gespeicherten Prozeduren das Präfix usp_ voran (um eine benutzerdefinierte gespeicherte Prozedur anzuzeigen), andere beginnen sie mit einem SQL-Schlüsselwort wie select , einfügen , aktualisieren , löschen . Andere verwenden eine Abkürzung für die Anwendung.
Einige verwenden Unterstriche, um jedes Wort in der gespeicherten Prozedur zu trennen (z. B. recent_albums ), während andere Titel verwenden (z. B. RecentAlbums ). ).
Daher ist es möglich, dass unsere gespeicherte Prozedur je nach verwendeter Namenskonvention wie folgt benannt wird.
- Neueste Alben
- aktuelle_alben
- uspRecentAlbums
- usp_recent_albums
- kürzliche Alben auswählen
- select_RecentAlbums
- select_recent_alben
- getRecentAlbums
- get_recent_alben
Du bekommst das Bild. Wichtig ist die Konsistenz. Wählen Sie eine aus und bleiben Sie dabei. Es wird es einfacher machen, wenn Sie eine gespeicherte Prozedur verwenden müssen. Stellen Sie sich vor, Sie haben Dutzende oder sogar Hunderte von gespeicherten Prozeduren, und jedes Mal, wenn Sie eine ausführen möchten, müssen Sie im Objekt-Explorer zu ihr navigieren, nur weil Sie sich nicht erinnern können, ob Sie sie usp_RecentAlbums genannt haben oder uspRecentAlbums .
Vermeiden Sie, wie bereits erwähnt, die Verwendung von sp_ als Präfix für die Namen Ihrer gespeicherten Prozeduren. SQL Server verwendet dieses Präfix für die gespeicherten Systemprozeduren.
SQL Server durchsucht zuerst die gespeicherten Systemprozeduren, sodass Sie bestenfalls einen Leistungseinbruch erleiden. Im schlimmsten Fall wird Ihre Prozedur nicht ausgeführt (wenn sie einen Namen mit einer gespeicherten Systemprozedur teilt).