sql >> Database teknologi >  >> RDS >> Sqlserver

SQL Server 2016:Opret en lagret procedure

En lagret procedure er en gruppe af SQL-sætninger kompileret til én. Lagrede procedurer kan omfatte forretningslogik og andre programmeringskonstruktioner.

I SQL Server er en lagret procedure en gruppe af en eller flere Transact-SQL-sætninger eller en reference til en Microsoft .NET Framework Common Runtime Language-metode (CLR).

Programmerbarhed

Men en lagret procedure er mere end blot et langt script. Det er et script, der er blevet gemt i SQL Server specifikt under Storede procedurer node, og den kan:

  • Accepter inputparametre (og returner flere værdier i form af outputparametre til det kaldende program).
  • Indeholder programmeringserklæringer.
  • Returner en statusværdi til et opkaldsprogram for at indikere succes eller fiasko og årsagen til en eventuel fiasko.

Lagrede procedurer indeholder ofte forretningslogik. For eksempel kan en lagret procedure acceptere parametre, der sendes til den og teste mod disse parametre ved hjælp af IF udsagn. F.eks. hvis parameteren er én værdi, gør dette, hvis det er en anden værdi, gør det.

Lagrede procedurer kan forbedre ydeevnen i en applikation, fordi den lagrede procedure analyseres og optimeres, så snart den er oprettet, og derefter gemt i hukommelsen. At køre en betinget forespørgsel via lagret procedure kan være ekstremt hurtig - sammenlignet med en applikation, der sender en forespørgsel på tværs af netværket, til SQL Serveren, og derefter får alle data returneret til den på tværs af netværket, så den kan filtrere gennem den og vælge ud kun de poster, den er interesseret i.

Fordele ved lagrede procedurer

Her er nogle af de vigtigste fordele ved at bruge lagrede procedurer:

Fordel Forklaring
Modulær programmering Du kan skrive en lagret procedure én gang og derefter kalde den igen og igen fra forskellige dele af en applikation (og endda fra flere applikationer).
Ydeevne Lagrede procedurer giver hurtigere kodeudførelse og reducerer netværkstrafikken.
  • Hurtigere udførelse:Lagrede procedurer parses og optimeres, så snart de er oprettet, og den lagrede procedure gemmes i hukommelsen. Det betyder, at det vil køre meget hurtigere end at sende mange linjer SQL-kode fra din applikation til SQL Serveren. At gøre det kræver, at SQL Server kompilerer og optimerer din SQL-kode, hver gang den kører.
  • Reduceret netværkstrafik:Hvis du sender mange linjer SQL-kode over netværket til din SQL Server, vil dette påvirke netværkets ydeevne. Dette gælder især, hvis du har hundredvis af linjer SQL-kode og/eller du har masser af aktivitet på din applikation. Kørsel af koden på SQL Server (som en lagret procedure) eliminerer behovet for at sende denne kode over netværket. Den eneste netværkstrafik vil være de angivne parametre og resultaterne af enhver forespørgsel.
Sikkerhed Brugere kan udføre en lagret procedure uden at skulle udføre nogen af ​​sætningerne direkte. Derfor kan en lagret procedure give avanceret databasefunktionalitet til brugere, der normalt ikke ville have adgang til disse opgaver, men denne funktionalitet er gjort tilgængelig på en stramt kontrolleret måde.

Sådan opretter du en lagret procedure

For at oprette en lagret procedure, brug CREATE PROCEDURE sætning, efterfulgt af koden, der udgør den lagrede procedure. Hvis din lagrede procedure skal acceptere parametre, skal de inkluderes efter navnet.

CREATE PROCEDURE myStoredProcedure AS
...

OR

CREATE PROCEDURE myStoredProcedure @ParameterName DataType AS
...

Vi vil nu oprette en lagret procedure baseret på en af ​​de visninger, som vi oprettede tidligere - Seneste Albums se.

Denne visning returnerer alle albums udgivet inden for de sidste 20 år. Det er fint, så længe det kun skal se 20 år tilbage. Men hvad nu hvis du vil have brugeren til at vælge, hvor mange år den skal dække?

En lagret procedure kan løse dette problem.

Vi vil oprette en lagret procedure, der accepterer en parameter. Værdien af ​​parameteren vil være antallet af år at søge tilbage over. Derfor kan denne værdi angives af brugeren, når de udfører den lagrede procedure.

  1. Design den lagrede procedure

    Åbn et nyt forespørgselsvindue, og tilføj koden til den lagrede procedure.

    I vores tilfælde vil vi kopiere/indsætte koden fra RecentArtists se og modificere den øverste del, så den bliver en lagret procedure.

    Vi tilføjer en parameter kaldet @Count som vil afgøre, hvor mange år den lagrede procedure skal se tilbage.

    Så vi erstatter den hårdkodede værdi af 20 med @Count

    Eksempelkode

    Her er koden fra vores eksempel:

    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. Opret den lagrede procedure

    Når det hele ser godt ud, kan du udføre sætningen for at oprette den lagrede procedure.

    Klik på Udfør for at oprette den lagrede procedure.

    Når den lagrede procedure er blevet oprettet, kan du se den i Objekt Explorer (du skal muligvis opdatere lagrede procedurer node først).

  3. Udfør den lagrede procedure

    Nu hvor den er oprettet, kan du udføre den lagrede procedure.

    Åbn et nyt forespørgselsvindue, tilføj dette:

    EXEC spRecentAlbums @Count = 5;

    Klik nu på Udfør fra værktøjslinjen.

    Den lagrede procedure vil returnere alle albums udgivet inden for de sidste 5 år.

  4. Prøv forskellige parametre

    Prøv at ændre værdien af ​​parameteren for at se, hvordan dette påvirker resultaterne.

    Du kan også køre flere sætninger efter hinanden. En ny resultatrude vises for hver erklæring.

Skabelon til lagret procedure

I SQL Server 2016 kan du oprette en lagret procedure ved at højreklikke på Stored Procedures node i Objekt Explorer og vælge Ny> Lagret procedure... eller Ny> Indbygget kompileret lagret procedure... .

Dette åbner en skabelon, der er klar til at blive udfyldt med din egen specifikke procedure.

Udfør en lagret procedure via GUI

Du kan også bruge den grafiske brugergrænseflade til at udføre en lagret procedure.

  1. Start Udfør procedure Dialogboks

    I Objekt Explorer skal du højreklikke på den lagrede procedure og vælge Udfør lagret procedure... .

  2. Forsyningsparametre

    Indtast en værdi for de parametre, som den lagrede procedure kræver, og klik derefter på OK .

  3. Resultaterne

    Resultaterne vises.

Rediger en lagret procedure

Hvis du har brug for at ændre en eksisterende lagret procedure, skal du blot erstatte CREATE med ALTER (sammen med den opdaterede procedure).

Dette eksempel ændrer den lagrede procedure, så resultaterne sorteres efter udgivelsesdato i faldende rækkefølge:

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;

Systemlagrede procedurer

SQL Server indeholder et stort antal systemlagrede procedurer til at hjælpe med databaseadministrationsopgaver. Mange af de opgaver, du kan udføre via GUI'en, kan udføres via en systemlagret procedure. For eksempel er nogle af de ting, du kan gøre med systemlagrede procedurer:

  • Konfigurer sikkerhedskonti
  • Konfigurer linkede servere
  • Opret en databasevedligeholdelsesplan
  • Opret fuldtekstsøgekataloger
  • Tilføj fjernlogin
  • Konfigurer replikering
  • Konfigurer planlagte job
  • og meget mere...

Systemlagrede procedurer er præfikset med sp__ , så det er bedst at undgå at bruge det præfiks til dine egne procedurer.

Navnekonventioner

Det er en god idé at udvikle en ensartet navnekonvention for dine lagrede procedurer (og for alle andre objekter i din database).

Nogle mennesker præfikser deres lagrede procedurer med usp_ (for at angive en brugerdefineret lagret procedure), andre begynder den med et SQL nøgleord såsom vælg , indsæt , opdatering , slet . Andre bruger en forkortelse for applikationen.

Nogle bruger understregninger til at adskille hvert ord i den lagrede procedure (f.eks. recent_albums ), mens andre vil bruge store og små bogstaver (f.eks. Seneste album ). ).

Derfor er det muligt, at vores lagrede procedure kan blive navngivet et af følgende, afhængigt af den navnekonvention, der bruges.

  • Seneste album
  • recent_albums
  • uspNylige album
  • usp_recent_albums
  • vælg Nylige Albums
  • select_RecentAlbums
  • select_recent_albums
  • getRecentAlbums
  • hent_seneste_album

Du får billedet. Det vigtige er konsistens. Vælg en og hold dig til den. Det vil gøre det nemmere, når du skal bruge en lagret procedure. Forestil dig at have scores, eller endda hundredvis af lagrede procedurer, og hver gang du går for at udføre en, skal du navigere til den i Objekt Explorer, fordi du ikke kan huske, om du kaldte den usp_RecentAlbums eller uspRecentAlbums .

Undgå som nævnt at bruge sp__ som præfiks for dine lagrede procedurenavne. SQL Server bruger dette præfiks til de systemlagrede procedurer.

SQL Server søger først i systemets lagrede procedurer, så i bedste fald får du et præstationshit. I værste fald vil din procedure ikke køre (hvis den deler et navn med en systemlagret procedure).


  1. @@ROWCOUNT – Få antallet af rækker, der er berørt af den sidste sætning i SQL Server

  2. Skift Oracle-port fra port 8080

  3. Sæt en dato i SQL-serveren

  4. Grundlæggende om sys.dm_exec_requests