sql >> Database >  >> RDS >> Sqlserver

SQL Server 2016:een opgeslagen procedure maken

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.
  • Sneller uitvoering:Opgeslagen procedures worden geparseerd en geoptimaliseerd zodra ze zijn gemaakt en de opgeslagen procedure wordt in het geheugen opgeslagen. Dit betekent dat het een stuk sneller zal worden uitgevoerd dan het verzenden van veel regels SQL-code van uw applicatie naar de SQL Server. Om dat te doen, moet SQL Server uw SQL-code elke keer dat deze wordt uitgevoerd, compileren en optimaliseren.
  • Gereduceerd netwerkverkeer:als u veel regels SQL-code via het netwerk naar uw SQL Server verzendt, heeft dit invloed op de netwerkprestaties. Dit is met name het geval als u honderden regels SQL-code hebt en/of veel activiteit op uw toepassing hebt. Het uitvoeren van de code op de SQL Server (als een opgeslagen procedure) elimineert de noodzaak om deze code over het netwerk te verzenden. Het enige netwerkverkeer zijn de opgegeven parameters en de resultaten van elke zoekopdracht.
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.

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

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

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

  1. Lanceer de procedure uitvoeren Dialoogvenster

    Klik in de Objectverkenner met de rechtermuisknop op de opgeslagen procedure en selecteer Opgeslagen procedure uitvoeren... .

  2. Aanvoerparameters

    Voer een waarde in voor alle parameters die de opgeslagen procedure vereist en klik vervolgens op OK .

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


  1. Entiteitskadercode is traag wanneer Include() vaak wordt gebruikt

  2. Postgres UTC-datumnotatie &tijdperk gegoten, tekeninversie

  3. FOUT:kon bibliotheek "/opt/PostgreSQL/9.0/lib/postgresql/plperl.so" niet laden:libperl.so:

  4. Retourneer de verhogingswaarde van een identiteitskolom in SQL Server