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
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.
|
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 ...
Eksempel
Her er et eksempel på at oprette en lagret procedure og derefter udføre den lagrede procedure.
-
Opret den lagrede procedure
Kør følgende erklæring mod musikdatabasen, som vi har oprettet gennem denne øvelse.
Dette eksempel opretter en lagret procedure kaldet AlbumsFromArtist. Den vælger alle album fra en kunstner, der er angivet, når den lagrede procedure kører.
CREATE PROCEDURE spAlbumsFromArtist @ArtistName varchar(255) AS SELECT AlbumName, ReleaseDate FROM Albums INNER JOIN Artists ON Albums.ArtistId = Artists.ArtistId WHERE Artists.ArtistName = @ArtistName; GO
-
Se den lagrede procedure
Udvid Programmerbarhed> Lagrede procedurer node under den relevante database for at se din nyoprettede lagrede procedure. Du kan også udvide den lagrede procedures parametre node for at se de parametre, du skal videregive, når du kører den.
-
Udfør den lagrede procedure
Nu hvor den lagrede procedure er blevet oprettet, kan du køre den ved at bruge en
EXECUTE
sætning og videregivelse af eventuelle nødvendige parametre.I vores eksempel skal vi videregive kunstnerens navn.
EXECUTE spAlbumsFromArtist @ArtistName = "Devin Townsend";
Alternativt kan du udelade parameternavnet, når du sender parametre. Sådan:
EXECUTE spAlbumsFromArtist "Devin Townsend";
Ændre en lagret procedure
Du kan ændre din lagrede procedure med ALTER PROCEDURE
udmelding. Ligesom når du ændrer en visning, kan du ændre en lagret procedure ved blot at anvende den nye definition af lagret procedure.
-
Rediger den lagrede procedure
Kør følgende erklæring. Dette tilføjer en ny kolonne til resultaterne, der returneres af den lagrede procedure. Vi tilføjer også aliaser til kolonnenavnene.
ALTER PROCEDURE spAlbumsFromArtist @ArtistName varchar(255) AS SELECT al.AlbumName, al.ReleaseDate, g.Genre FROM Albums al INNER JOIN Artists ar ON al.ArtistId = ar.ArtistId INNER JOIN Genres g ON g.GenreId = al.GenreId WHERE ar.ArtistName = @ArtistName; GO
-
Udfør den lagrede procedure
Nu hvor vi har tilføjet
Genre
kolonne til visningen, returnerer den lagrede procedure nu den kolonne, når vi udfører den.EXECUTE spAlbumsFromArtist @ArtistName = "Devin Townsend";