Procedury składowane można porównać trochę do procedur, które tworzone są w językach programowania. Mogą przyjmować parametry, przetwarzać dane, wykonując szereg operacji zdefiniowanych w języku SQL i w efekcie zmieniać dane w tabelach, tworzyć tabele, usuwać je itd. Dzięki rozszerzeniom Transact-SQL zastosowanym w SQL Server, możliwe jest w ich ramach budowanie nawet instrukcji warunkowych. Aby przybliżyć zagadnienie procedury składowanej, zbudujemy jedną w naszej bazie "nowa_baza". Stworzymy procedurę, która będzie zwracała określony wynik w postaci tabeli wg podawanego parametru. Nasz program będzie prosty, jednak najważniejsze jest zaprezentowanie samej idei i możliwości jakie daje to narzędzie. Spójrzmy na graficzną opcję tworzenia procedury:
![Pełny rozmiar](https://cont-evo.eu/strefa_darmowa/sqlsrv/images/tn_t06_c04_p02_01.png)
Popatrzmy teraz na strukturę procedury:
![Pełny rozmiar](https://cont-evo.eu/strefa_darmowa/sqlsrv/images/tn_t06_c04_p02_02.png)
Widzimy mnóstwo komentarzy (zielone teksty), które kreator nam wstawił w celu ułatwienia użytkownikowi odnalezienia się w kodzie procedury. Kluczowe i najważniejsze jednak polecenia są zawarte pomiędzy wierszami CREATE PROCEDURE oraz END. Uprościmy więc kształt to następującej postaci:
![Pełny rozmiar](https://cont-evo.eu/strefa_darmowa/sqlsrv/images/tn_t06_c04_p02_03.png)
Nasza procedura posiada jedynie jeden parametr "@klient" o typie "varchar(50)" (sposób definicji jest widoczny na zaraz po "CREATE", w przypadku większej liczby parametrów, każdą definicję oddzielamy przecinkiem) i polega na wygenerowaniu wartości sprzedaży dla podanego w nim klienta. Uruchamiając ją poleceniem Execute doprowadzimy do jej zapisania w bazie (użyjmy polecenia Refresh aby ją zobaczyć na drzewie obiektów):
![Pełny rozmiar](https://cont-evo.eu/strefa_darmowa/sqlsrv/images/tn_t06_c04_p02_04.png)
Jeśli chcielibyśmy cokolwiek zmienić w istniejącej procedurze, wystarczy że w jej definicji słowo CREATE zmienimy na ALTER. Pokazane powyżej polecenie spowoduje uruchomienie procedury:
![Pełny rozmiar](https://cont-evo.eu/strefa_darmowa/sqlsrv/images/tn_t06_c04_p02_05.png)
Po podaniu wartości parametru oraz naciśnięciu przycisku OK uzyskamy wynik oraz kształt polecenia ją wywołującego (w górze ekranu):
![Pełny rozmiar](https://cont-evo.eu/strefa_darmowa/sqlsrv/images/tn_t06_c04_p02_06.png)
Słowa komentarza wymagają różne polecenia dodatkowe dotyczące właściwości zapytań i procedury składowanej pojawiające się w niej:
- SET ANSI_NULLS - ustawione na ON powoduje, że ewentualne klauzule typu WHERE nazwa_kolumny = NULL nie zwrócą rekordów nawet, jeżeli w danej kolumnie występują rekordy zawierające NULL. Podobnie jest z operatorem <> NULL.
- SET QUOTED_IDENTIFIER - definiuje w jaki sposób mają być oznaczane identyfikatory obiektów w zapytaniach, jeśli ustawione na ON teksty używane w zapytaniach powinny być otoczone pojedynczym apostrofem, natomiast identyfikatory obiektów cudzysłowem (podwójnym). Możliwe jest jednak dzięki temu użycie w identyfikatorach nawet słów kluczowych, czyli np. nazwy tabeli jako "TABLE" (co nie jest możliwe w innej sytuacji).
- SET NOCOUNT - jeśli ustawione na ON, to procedura za każdym uruchomieniem nie będzie zwracać liczby uzyskanych w wyniku jej wykonania rekordów (dodatkowo informacja tak widoczna jest po uruchomieniu w zakładce "Messages"). W przypadku dużej liczby powtórzeń uruchomienia procedury, możemy dzięki tej opcji zredukować ruch na serwerze.