Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL Server 2016:Erstellen Sie eine gespeicherte Prozedur

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.
  • Schnellere Ausführung:Gespeicherte Prozeduren werden geparst und optimiert, sobald sie erstellt werden, und die gespeicherte Prozedur wird im Arbeitsspeicher gespeichert. Dies bedeutet, dass es viel schneller ausgeführt wird, als viele Zeilen SQL-Code von Ihrer Anwendung an den SQL Server zu senden. Dazu muss SQL Server Ihren SQL-Code bei jeder Ausführung kompilieren und optimieren.
  • Reduzierter Netzwerkverkehr:Wenn Sie viele Zeilen SQL-Code über das Netzwerk an Ihren SQL Server senden, wirkt sich dies auf die Netzwerkleistung aus. Dies gilt insbesondere, wenn Sie Hunderte von Zeilen SQL-Code haben und/oder Ihre Anwendung viel Aktivität hat. Durch Ausführen des Codes auf dem SQL Server (als gespeicherte Prozedur) entfällt die Notwendigkeit, diesen Code über das Netzwerk zu senden. Der einzige Netzwerkverkehr besteht aus den bereitgestellten Parametern und den Ergebnissen aller Abfragen.
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.

  1. 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()));
  2. 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).

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

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

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

  2. Lieferparameter

    Geben Sie einen Wert für alle Parameter ein, die die gespeicherte Prozedur erfordert, und klicken Sie dann auf OK .

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