En lagrad procedur är en grupp SQL-satser kompilerade till en. Lagrade procedurer kan inkludera affärslogik och andra programmeringskonstruktioner.
I SQL Server är en lagrad procedur en grupp av en eller flera Transact-SQL-satser eller en referens till en Microsoft .NET Framework common runtime language (CLR)-metod.
Programmerbarhet
En lagrad procedur är mer än bara ett långt skript. Det är ett skript som har sparats i SQL Server specifikt under Lagrade procedurer nod, och den kan:
- Acceptera indataparametrar (och returnera flera värden i form av utdataparametrar till det anropande programmet).
- Innehåller programmeringsförklaringar.
- Återställ ett statusvärde till ett anropsprogram för att indikera framgång eller misslyckande och orsaken till eventuella misslyckanden.
Lagrade procedurer innehåller ofta affärslogik. Till exempel kan en lagrad procedur acceptera parametrar som skickas till den och testa mot dessa parametrar med IF
uttalanden. T.ex. om parametern är ett värde, gör detta, om det är ett annat värde, gör det.
Lagrade procedurer kan förbättra prestandan i en applikation, eftersom den lagrade proceduren analyseras och optimeras så snart den skapas och sedan lagras i minnet. Att köra en villkorlig förfrågan via lagrad procedur kan vara extremt snabbt - jämfört med en applikation som skickar en förfrågan över nätverket, till SQL-servern, och sedan får all data tillbaka till den över nätverket så att den kan filtrera igenom den och välja ut endast de skivor den är intresserad av.
Fördelar med lagrade procedurer
Här är några av de viktigaste fördelarna med att använda lagrade procedurer:
Förmån | Förklaring |
---|---|
Modulär programmering | Du kan skriva en lagrad procedur en gång och sedan anropa den igen och igen, från olika delar av en applikation (och till och med från flera applikationer). |
Prestanda | Lagrade procedurer ger snabbare kodexekvering och minskar nätverkstrafiken.
|
Säkerhet | Användare kan köra en lagrad procedur utan att behöva köra någon av satserna direkt. Därför kan en lagrad procedur tillhandahålla avancerad databasfunktionalitet för användare som normalt inte skulle ha tillgång till dessa uppgifter, men denna funktionalitet görs tillgänglig på ett hårt kontrollerat sätt. |
Hur man skapar en lagrad procedur
För att skapa en lagrad procedur, använd CREATE PROCEDURE
uttalande, följt av koden som utgör den lagrade proceduren. Om din lagrade procedur ska acceptera parametrar måste de inkluderas efter namnet.
CREATE PROCEDURE myStoredProcedure AS ... OR CREATE PROCEDURE myStoredProcedure @ParameterName DataType AS ...
Exempel
Här är ett exempel på att skapa en lagrad procedur och sedan exekvera den lagrade proceduren.
-
Skapa den lagrade proceduren
Kör följande uttalande mot musikdatabasen som vi har skapat genom denna handledning.
Detta exempel skapar en lagrad procedur som kallas AlbumsFromArtist. Den väljer alla album från en artist som anges när den lagrade proceduren körs.
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
-
Visa den lagrade förfarandet
Expandera Programmerbarhet> Lagrade procedurer nod under den tillämpliga databasen för att se din nyskapade lagrade procedur. Du kan också utöka den lagrade procedurens parametrar nod för att se parametrarna du måste skicka när du kör den.
-
Utför den lagrade proceduren
Nu när den lagrade proceduren har skapats kan du köra den genom att använda en
EXECUTE
och skicka alla nödvändiga parametrar.I vårt exempel måste vi skicka artistens namn.
EXECUTE spAlbumsFromArtist @ArtistName = "Devin Townsend";
Alternativt kan du utelämna parameternamnet när du skickar parametrar. Så här:
EXECUTE spAlbumsFromArtist "Devin Townsend";
Ändra en lagrad procedur
Du kan ändra din lagrade procedur med ALTER PROCEDURE
påstående. Precis som när du ändrar en vy, kan du ändra en lagrad procedur genom att helt enkelt tillämpa den nya lagrade procedurdefinitionen.
-
Ändra den lagrade proceduren
Kör följande uttalande. Detta lägger till en ny kolumn till resultaten som returneras av den lagrade proceduren. Vi lägger också till alias till kolumnnamnen.
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
-
Utför den lagrade proceduren
Nu när vi har lagt till
Genre
kolumnen till vyn, returnerar den lagrade proceduren nu den kolumnen när vi kör den.EXECUTE spAlbumsFromArtist @ArtistName = "Devin Townsend";