Een opgeslagen procedure is een groep SQL-instructies die tot één is gecompileerd. Opgeslagen procedures kunnen bedrijfslogica en andere programmeerconstructies bevatten.
In SQL Server is een opgeslagen procedure een groep van een of meer Transact-SQL-instructies of een verwijzing naar een Microsoft .NET Framework Common Runtime Language (CLR)-methode.
Programmeerbaarheid
Maar een opgeslagen procedure is meer dan alleen een lang script. Het is een script dat specifiek in SQL Server is opgeslagen onder de Opgeslagen procedures knooppunt, en het kan:
- Accepteer invoerparameters (en retourneer meerdere waarden in de vorm van uitvoerparameters naar het aanroepende programma).
- Bevat programmeerinstructies.
- Retourneer een statuswaarde aan een aanroepend programma om succes of mislukking aan te geven, en de reden voor elke mislukking.
Opgeslagen procedures bevatten vaak bedrijfslogica. Een opgeslagen procedure kan bijvoorbeeld parameters accepteren die eraan worden doorgegeven en testen tegen die parameters met behulp van IF
verklaringen. Bijvoorbeeld, als de parameter één waarde is, doe dit, als het een andere waarde is, doe dat.
Opgeslagen procedures kunnen de prestaties in een toepassing verbeteren, omdat de opgeslagen procedure wordt geparseerd en geoptimaliseerd zodra deze is gemaakt en vervolgens in het geheugen wordt opgeslagen. Het uitvoeren van een voorwaardelijke query via een opgeslagen procedure kan extreem snel zijn - vergeleken met een toepassing die een query via het netwerk naar de SQL Server verzendt en vervolgens alle gegevens via het netwerk terugstuurt, zodat deze er doorheen kan filteren en eruit kan kiezen alleen de records waarin het geïnteresseerd is.
Voordelen van opgeslagen procedures
Hier zijn enkele van de belangrijkste voordelen van het gebruik van opgeslagen procedures:
Voordeel | Uitleg |
---|---|
Modulair programmeren | Je kunt een opgeslagen procedure één keer schrijven en deze vervolgens keer op keer oproepen, vanuit verschillende delen van een applicatie (en zelfs vanuit meerdere applicaties). |
Prestaties | Opgeslagen procedures zorgen voor een snellere uitvoering van code en verminderen het netwerkverkeer.
|
Beveiliging | Gebruikers kunnen een opgeslagen procedure uitvoeren zonder de instructies direct uit te hoeven voeren. Daarom kan een opgeslagen procedure geavanceerde databasefunctionaliteit bieden voor gebruikers die normaal geen toegang hebben tot deze taken, maar deze functionaliteit wordt op een streng gecontroleerde manier beschikbaar gesteld. |
Een opgeslagen procedure maken
Gebruik de CREATE PROCEDURE
. om een opgeslagen procedure aan te maken statement, gevolgd door de code waaruit de opgeslagen procedure bestaat. Als uw opgeslagen procedure parameters accepteert, moeten deze achter de naam worden opgenomen.
CREATE PROCEDURE myStoredProcedure AS ... OR CREATE PROCEDURE myStoredProcedure @ParameterName DataType AS ...
We gaan nu een opgeslagen procedure maken op basis van een van de views die we eerder hebben gemaakt:de RecentAlbums bekijken.
Deze weergave toont alle albums die in de afgelopen 20 jaar zijn uitgebracht. Dat is prima, zolang het maar 20 jaar hoeft terug te kijken. Maar wat als u wilt dat de gebruiker kiest hoeveel jaar hij moet dekken?
Een opgeslagen procedure kan dit probleem oplossen.
We zullen een opgeslagen procedure maken die een parameter accepteert. De waarde van de parameter is het aantal jaren waarin terug moet worden gezocht. Daarom kan deze waarde door de gebruiker worden opgegeven wanneer hij de opgeslagen procedure uitvoert.
-
Ontwerp de opgeslagen procedure
Open een nieuw queryvenster en voeg de code voor de opgeslagen procedure toe.
In ons geval zullen we de code kopiëren/plakken van de RecentArtists bekijk en wijzig het bovenste gedeelte, zodat het een opgeslagen procedure wordt.
We zullen een parameter toevoegen met de naam
@Count
die zal bepalen hoeveel jaar de opgeslagen procedure terug moet kijken.Dus vervangen we de hardcoded waarde van
20
met@Count
Voorbeeldcode
Hier is de code uit ons voorbeeld:
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()));
-
Maak de opgeslagen procedure
Als alles er goed uitziet, kunt u de instructie uitvoeren om de opgeslagen procedure te maken.
Klik op Uitvoeren om de opgeslagen procedure te maken.
Nadat de opgeslagen procedure is gemaakt, kunt u deze zien in de Objectverkenner (mogelijk moet u de Opgeslagen procedures vernieuwen knoop eerst).
-
Voer de opgeslagen procedure uit
Nu het is gemaakt, kunt u de opgeslagen procedure uitvoeren.
Open een nieuw zoekvenster, voeg dit toe:
EXEC spRecentAlbums @Count = 5;
Klik nu op Uitvoeren van de werkbalk.
De opgeslagen procedure zal alle albums retourneren die in de afgelopen 5 jaar zijn uitgebracht.
-
Probeer verschillende parameters
Probeer de waarde van de parameter te wijzigen om te zien hoe dit de resultaten beïnvloedt.
U kunt ook meerdere opdrachten achter elkaar uitvoeren. Voor elke uitspraak verschijnt een nieuw resultatenvenster.
Opgeslagen proceduresjabloon
In SQL Server 2016 kunt u een opgeslagen procedure maken door met de rechtermuisknop te klikken op de Opgeslagen procedures knooppunt in de Objectverkenner en selecteer Nieuw> Opgeslagen procedure... of Nieuw> Native gecompileerde opgeslagen procedure... .
Dit opent een sjabloon die klaar is om te worden ingevuld met uw eigen specifieke procedure.
Voer een opgeslagen procedure uit via de GUI
U kunt ook de grafische gebruikersinterface gebruiken om een opgeslagen procedure uit te voeren.
-
Lanceer de procedure uitvoeren Dialoogvenster
Klik in de Objectverkenner met de rechtermuisknop op de opgeslagen procedure en selecteer Opgeslagen procedure uitvoeren... .
-
Aanvoerparameters
Voer een waarde in voor alle parameters die de opgeslagen procedure vereist en klik vervolgens op OK .
-
De resultaten
De resultaten worden weergegeven.
Een opgeslagen procedure wijzigen
Als u een bestaande opgeslagen procedure moet wijzigen, vervangt u eenvoudig CREATE
met ALTER
(samen met de bijgewerkte procedure).
Dit voorbeeld wijzigt de opgeslagen procedure zodat de resultaten worden gesorteerd op releasedatum in aflopende volgorde:
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;
In het systeem opgeslagen procedures
SQL Server bevat een groot aantal door het systeem opgeslagen procedures om te helpen bij databasebeheertaken. Veel van de taken die u via de GUI kunt uitvoeren, kunnen worden uitgevoerd via een door het systeem opgeslagen procedure. Enkele dingen die u bijvoorbeeld kunt doen met door het systeem opgeslagen procedures zijn:
- Beveiligingsaccounts configureren
- Gekoppelde servers instellen
- Een database-onderhoudsplan maken
- Maak catalogi voor zoeken in volledige tekst
- Aanmelding op afstand toevoegen
- Replicatie configureren
- Geplande taken instellen
- en nog veel meer...
Op het systeem opgeslagen procedures worden voorafgegaan door sp_ , dus het is het beste om dat voorvoegsel niet voor uw eigen procedures te gebruiken.
Naamconventies
Het is een goed idee om een consistente naamgevingsconventie te ontwikkelen voor uw opgeslagen procedures (en voor alle andere objecten in uw database).
Sommige mensen laten hun opgeslagen procedures voorafgaan met usp_ (om een door de gebruiker gedefinieerde opgeslagen procedure aan te geven), anderen beginnen deze met een SQL-sleutelwoord zoals select , invoegen , bijwerken , verwijder . Anderen gebruiken een afkorting voor de applicatie.
Sommige gebruiken onderstrepingstekens om elk woord in de opgeslagen procedure te scheiden (bijv. recent_albums ), terwijl anderen titelhoofdletters gebruiken (bijv. RecentAlbums ).
Daarom is het mogelijk dat onze opgeslagen procedure een van de volgende namen krijgt, afhankelijk van de gebruikte naamgevingsconventie.
- Recente albums
- recente_albums
- uspRecentAlbums
- usp_recent_albums
- selectRecentAlbums
- select_RecentAlbums
- select_recent_albums
- getRecentAlbums
- get_recent_albums
Je krijgt het beeld. Het belangrijkste is consistentie. Kies er een uit en blijf erbij. Het maakt het gemakkelijker wanneer u een opgeslagen procedure moet gebruiken. Stel je voor dat je scores hebt, of zelfs honderden opgeslagen procedures, en elke keer dat je er een uitvoert, moet je ernaartoe navigeren in de Objectverkenner, puur omdat je niet meer weet of je het usp_RecentAlbums hebt genoemd. of uspRecentAlbums .
Zoals vermeld, vermijd het gebruik van sp_ als het voorvoegsel voor uw opgeslagen procedurenamen. SQL Server gebruikt dit voorvoegsel voor de door het systeem opgeslagen procedures.
SQL Server doorzoekt eerst de door het systeem opgeslagen procedures, dus in het beste geval krijgt u een prestatiehit. In het slechtste geval wordt uw procedure niet uitgevoerd (als deze een naam deelt met een door het systeem opgeslagen procedure).