Procedura składowana to grupa instrukcji SQL skompilowanych w jedną. Procedury składowane mogą obejmować logikę biznesową i inne konstrukcje programistyczne.
W SQL Server procedura składowana to grupa składająca się z co najmniej jednej instrukcji Transact-SQL lub odwołanie do metody języka CLR (Common Runtime Language) Microsoft .NET Framework.
Programowalność
Ale procedura składowana to coś więcej niż tylko długi skrypt. Jest to skrypt, który został zapisany w SQL Server specjalnie w Procedury składowane węzeł i może:
- Zaakceptuj parametry wejściowe (i zwróć wiele wartości w postaci parametrów wyjściowych do programu wywołującego).
- Zawierają instrukcje programowania.
- Zwróć wartość statusu do programu wywołującego, aby wskazać sukces lub niepowodzenie oraz przyczynę każdego niepowodzenia.
Procedury składowane często zawierają logikę biznesową. Na przykład procedura składowana może akceptować parametry, które są do niej przekazywane, i testować te parametry za pomocą IF
sprawozdania. Np. jeśli parametr ma jedną wartość, zrób to, jeśli to inna wartość, zrób to.
Procedury składowane mogą poprawić wydajność aplikacji, ponieważ procedura składowana jest analizowana i optymalizowana zaraz po utworzeniu, a następnie przechowywana w pamięci. Uruchamianie zapytania warunkowego za pomocą procedury składowanej może być niezwykle szybkie — w porównaniu z aplikacją, która wysyła zapytanie przez sieć do serwera SQL, a następnie wszystkie dane są do niego zwracane przez sieć, dzięki czemu może je przefiltrować i wybrać tylko te rekordy, które go interesują.
Zalety procedur zapisanych
Oto niektóre z głównych zalet korzystania z procedur składowanych:
Korzyść | Wyjaśnienie |
---|---|
Programowanie modułowe | Możesz napisać procedurę składowaną raz, a następnie wywoływać ją wielokrotnie, z różnych części aplikacji (a nawet z wielu aplikacji). |
Wydajność | Procedury przechowywane zapewniają szybsze wykonywanie kodu i zmniejszają ruch w sieci.
|
Bezpieczeństwo | Użytkownicy mogą wykonywać procedurę składowaną bez konieczności bezpośredniego wykonywania jakichkolwiek instrukcji. Dlatego procedura składowana może zapewnić zaawansowaną funkcjonalność bazy danych użytkownikom, którzy normalnie nie mieliby dostępu do tych zadań, ale ta funkcjonalność jest udostępniana w ściśle kontrolowany sposób. |
Jak utworzyć procedurę składowaną
Aby utworzyć procedurę składowaną, użyj CREATE PROCEDURE
instrukcja, po której następuje kod, który tworzy procedurę składowaną. Jeśli twoja procedura składowana ma akceptować parametry, muszą one być dołączone po nazwie.
CREATE PROCEDURE myStoredProcedure AS ... OR CREATE PROCEDURE myStoredProcedure @ParameterName DataType AS ...
Utworzymy teraz procedurę składowaną opartą na jednym z widoków, które utworzyliśmy wcześniej — RecentAlbums widok.
Ten widok zwraca wszystkie albumy wydane w ciągu ostatnich 20 lat. Jest to w porządku, o ile wystarczy spojrzeć tylko 20 lat wstecz. Ale co, jeśli chcesz, aby użytkownik wybrał, ile lat ma obejmować?
Procedura składowana może rozwiązać ten problem.
Stworzymy procedurę składowaną, która akceptuje parametr. Wartość parametru będzie liczbą lat do przeszukania wstecz. Dlatego ta wartość może być określona przez użytkownika za każdym razem, gdy wykonuje on procedurę składowaną.
-
Zaprojektuj procedurę składowaną
Otwórz nowe okno zapytania i dodaj kod procedury składowanej.
W naszym przypadku skopiujemy/wkleimy kod z RecentArtists wyświetlić i zmodyfikować górną część, tak aby stała się procedurą składowaną.
Dodamy parametr o nazwie
@Count
to określi, ile lat powinna mieć procedura składowana wstecz.Zastąpimy więc zakodowaną na stałe wartość
20
z@Count
Przykładowy kod
Oto kod z naszego przykładu:
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()));
-
Utwórz zapisaną procedurę
Gdy wszystko wygląda dobrze, możesz wykonać instrukcję, aby utworzyć procedurę składowaną.
Kliknij Wykonaj aby utworzyć procedurę składowaną.
Po utworzeniu procedury składowanej można ją zobaczyć w Eksploratorze obiektów (może być konieczne odświeżenie Procedur składowanych najpierw węzeł).
-
Wykonaj procedurę zapisaną
Teraz, po utworzeniu, możesz wykonać procedurę składowaną.
Otwórz nowe okno zapytania, dodaj to:
EXEC spRecentAlbums @Count = 5;
Teraz kliknij Wykonaj z paska narzędzi.
Procedura składowana zwróci wszystkie albumy wydane w ciągu ostatnich 5 lat.
-
Wypróbuj różne parametry
Spróbuj zmienić wartość parametru, aby zobaczyć, jak wpływa to na wyniki.
Możesz także uruchamiać wiele instrukcji jedna po drugiej. Dla każdego stwierdzenia pojawi się nowe okienko wyników.
Szablon procedury przechowywanej
W SQL Server 2016 można utworzyć procedurę składowaną, klikając prawym przyciskiem myszy Procedury składowane w Eksploratorze obiektów i wybierając Nowy> Procedura przechowywana... lub Nowe> Natywnie skompilowana procedura składowana... .
Spowoduje to otwarcie szablonu, który jest gotowy do wypełnienia według własnej procedury.
Wykonaj procedurę przechowywaną za pomocą GUI
Do wykonania procedury składowanej można również użyć graficznego interfejsu użytkownika.
-
Uruchom procedurę wykonania Okno dialogowe
W Eksploratorze obiektów kliknij prawym przyciskiem myszy procedurę składowaną i wybierz Wykonaj procedurę składowaną... .
-
Parametry zasilania
Wprowadź wartość dla dowolnych parametrów wymaganych przez procedurę składowaną, a następnie kliknij OK .
-
Wyniki
Wyniki są wyświetlane.
Zmień procedurę składowaną
Jeśli chcesz zmodyfikować istniejącą procedurę składowaną, po prostu zastąp CREATE
z ALTER
(wraz ze zaktualizowaną procedurą).
Ten przykład modyfikuje procedurę składowaną w taki sposób, że wyniki są sortowane według daty wydania w kolejności malejącej:
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;
Procedury przechowywane w systemie
SQL Server zawiera dużą liczbę systemowych procedur składowanych, które pomagają w zadaniach administracyjnych baz danych. Wiele zadań, które można wykonać za pomocą GUI, można wykonać za pomocą systemowej procedury składowanej. Na przykład niektóre czynności, które można wykonać za pomocą systemowych procedur składowanych, obejmują:
- Konfiguruj konta bezpieczeństwa
- Skonfiguruj połączone serwery
- Utwórz plan konserwacji bazy danych
- Utwórz katalogi wyszukiwania pełnotekstowego
- Dodaj zdalny login
- Skonfiguruj replikację
- Ustaw zaplanowane zadania
- i wiele więcej...
Systemowe procedury składowane mają przedrostek sp_ , więc najlepiej jest unikać używania tego przedrostka do własnych procedur.
Konwencje nazewnictwa
Dobrym pomysłem jest opracowanie spójnej konwencji nazewnictwa dla procedur składowanych (i wszystkich innych obiektów w bazie danych).
Niektórzy ludzie poprzedzają swoje procedury składowane przedrostkiem usp_ (aby wskazać procedurę składowaną zdefiniowaną przez użytkownika), inni rozpoczynają ją od słowa kluczowego SQL, takiego jak select , wstaw , aktualizacja , usuń . Inni używają skrótu nazwy aplikacji.
Niektórzy używają podkreślników do oddzielenia każdego słowa w procedurze składowanej (np. recent_albums ), podczas gdy inni będą używać wielkich liter (np. RecentAlbums ).
Dlatego możliwe jest, że nasza procedura składowana może mieć dowolną z poniższych nazw, w zależności od używanej konwencji nazewnictwa.
- Ostatnie albumy
- ostatnie_albumy
- uspRecentAlbumy
- usp_recent_albums
- wybierz ostatnie albumy
- select_RecentAlbums
- select_recent_albums
- pobierz najnowsze albumy
- get_recent_albums
Dostajesz obraz. Ważna jest spójność. Wybierz jedną i trzymaj się jej. Ułatwi to korzystanie z procedury składowanej. Wyobraź sobie, że masz wyniki, a nawet setki procedur składowanych i za każdym razem, gdy chcesz wykonać jedną, musisz przejść do niej w Eksploratorze obiektów tylko dlatego, że nie pamiętasz, czy nazwałeś ją usp_RecentAlbums lub uspRecentAlbums .
Jak wspomniano, unikaj używania sp_ jako prefiks nazw procedur składowanych. SQL Server używa tego przedrostka dla systemowych procedur składowanych.
SQL Server najpierw przeszukuje systemowe procedury składowane, więc w najlepszym przypadku odnotujesz spadek wydajności. W najgorszym przypadku twoja procedura się nie uruchomi (jeśli ma tę samą nazwę co systemowa procedura składowana).