Blog JSystems - uwalniamy wiedzę!

Szukaj

Funkcja użytkownika, w skrócie

Funkcja skalarna:

CREATE FUNCTION fnPelneImie(@i NVARCHAR(50), @n NVARCHAR(50))
RETURNS NVARCHAR(101) AS
BEGIN
  RETURN @i + ' ' + @n;
END;

Funkcje użytkownika (UDF – user-defined functions) mogą wykonywać zapytania i obliczenia oraz zwracać zarówno wartości skalarne, jak i zbiory danych w tabelach. Funkcje takie mają jednak pewne ograniczenia, przykładowo nie mogą korzystać z niedeterministycznych funkcji systemowych ani wykonywać wyrażeń z grupy DML i DDL, przez co nie mogą wprowadzać modyfikacji do struktury ani zawartości bazy danych. Nie mogą też wykonywać dynamicznych zapytań SQL ani zmieniać stanu bazy danych.

Funkcje tak jak i procedury tworzymy za pomocą poleceń CREATE, modifukujemy poleceniami ALTER i kasujemy przy użyciu DROP.

Przy tworzeniu funkcji, musimy od razu zadeklarować co taka funkcja będzie zwracała – jaki typ danych, należy przy tym dobrze przewidzieć wielkość wyniku, ponieważ jeśli damy za mało, to wynik zostanie ucięty (w przypadku liczb np. do wartości całkowitej, jeśli na wyjściu obiecamy

INT, zaś w przypadku łańcuchów znaków do obiecanej ilości znaków)

Funkcje skalarne

Funkcje skalarne są to funkcje które zwracają jedną wartość, mogą zwrócić dowolny (prosty np. INT, VARCHAR, DATETIME itp.) typ danych.

Poniżej przykład takiej funkcji, która jako parametr wejściowy przyjmie promień koła i zwóci jego pole:

Funkcje skalarne: Funkcje użytkownika (UDF) w SQL

Wywołanie takiej funkcji następuje w klauzuli SELECT lub np. wynik funkcji możemy przypisać do zmiennej.

Funkcje skalarne: Funkcje użytkownika (UDF) w SQL (2)

Funkcja może również wywołać sama siebie (rekurencja), dla przykładu funkcja obliczająca silnie dla liczby podanej jako parametr wejściowy:

Funkcje skalarne: Funkcje użytkownika (UDF) w SQL (3)

Sprawdzenie funkcji:

Funkcje skalarne: Funkcje użytkownika (UDF) w SQL (4)

I szybka walidacja czy wynik jest prawidłowy:

Funkcje skalarne: Funkcje użytkownika (UDF) w SQL (5)

W SQL Server jesteśmy ograniczeni do maksymalnie 32 poziomów rekurencji.

W funkcji ObliczSilnie pojawił się dopisek "WITH RETURNS NULL ON NULL INPUT", oznacza on, że jeśli uzytkownik poda jako parametr wejściowy wartość null, to wtedy funkcja ta ma nic nie obliczać, tylko odgórnie zwrócić wartość null.

Funkcje tabelaryczne

Funkcje tabelaryczne najprościej ujmując zwracają wynik w formie tabelarycznej.

W MS SQL Server mamy do czynienia z dwoma rodzajami takich funkcji, pierwszy z nich to multi-statement table-value. Wtedy w ciele funkcji definiujemy jako typ tabelę jaka będzie zwracana jako wynik jej działania.

Funkcje tabelaryczne: Funkcje użytkownika (UDF) w SQL

Do wyniku takiej funkcji odwołujemy się jak do zwykłej tabeli:

Funkcje tabelaryczne: Funkcje użytkownika (UDF) w SQL (2)

Co więcej, wiersze zwracane przez taką funkcję możemy filtrować za pomocą zwykłej klauzuli WHERE:

Funkcje tabelaryczne: Funkcje użytkownika (UDF) w SQL (3)

Innym rodzajem funkcji jaka zwróci nam wynik w formie tabelarycznej jest funkcja typu inline table-valued. Korzysta się z niej podobnie, jednakże sposób rozpisania funkcji jest nieco inny. Cały wynik zapisujemy za pomocą klauzuli SELECT umieszczając ją w klauzuli RETURN.

Poniżej przykład takiej funkcji która zwróci kilku (sami ustalimy ilu) pracowników o najwyższej pensji, dla danego managera, którego nazwisko podamy przy uruchamianiu takiej funkcji:

Funkcje tabelaryczne: Funkcje użytkownika (UDF) w SQL (4)

I próba uruchomienia tego typu funkcji, za pomocą kaluzuli SELECT:

Funkcje tabelaryczne: Funkcje użytkownika (UDF) w SQL (5)

Jakie są zatem różnice pomiędzy procedurami a funkcjami tabelarycznymi (table-valued functions), skoro i jedne i drugie mogą działać i zwracać podobne rezultaty, poza tym, że oczywiście wywołujemy/uruchamiamy je w inny sposób.

Funkcje:

-są łatwiejsze w użyciu

-ich wynik można przypisać do zmiennej

-nie mogą modyfikować danych

-często powodują problemy wydajnościowe.

Procedury:

-potrafią modyfikować dane

-potrafią wykonywać dynamiczny kod SQL statements

-potrafią przechwytywać błędy

-mogą zwracać wiele wyników.

 

 

Baner szkolenia Kompleksowe SQL w Microsoft SQL Server w JSystems, terminy gwarantowane

Szkolenie Kompleksowe SQL w Microsoft SQL Server →

To szkolenie może być dofinansowane dla Ciebie z KFS lub BUR.

★★★★★Średnia ocena naszych szkoleń w Google: 5/5

Najczęściej zadawane pytania

Czym jest funkcja użytkownika (UDF) w T-SQL?
To funkcja definiowana przez użytkownika, która może wykonywać zapytania i obliczenia oraz zwracać wartość skalarną lub zbiór danych w tabeli. Tworzymy ją poleceniem CREATE FUNCTION, podobnie jak procedury tworzymy poleceniem CREATE.
Jakie ograniczenia mają funkcje użytkownika?
Funkcje nie mogą modyfikować struktury ani zawartości bazy, nie wykonują poleceń DML i DDL, nie uruchamiają dynamicznego SQL ani nie korzystają z niedeterministycznych funkcji systemowych. To odróżnia je od procedur, które potrafią zmieniać dane.
Czym różnią się funkcje skalarne od tabelarycznych?
Funkcja skalarna zwraca jedną wartość dowolnego prostego typu, na przykład liczbę lub tekst. Funkcja tabelaryczna zwraca wynik w formie tabeli, do której odwołujemy się jak do zwykłej tabeli i którą można filtrować klauzulą WHERE.
Dlaczego trzeba dobrze dobrać typ zwracany funkcji?
Bo typ deklarujemy z góry i musimy przewidzieć wielkość wyniku. Jeśli zadeklarujemy za mało, wynik zostanie ucięty, na przykład liczba do wartości całkowitej, a łańcuch znaków do obiecanej liczby znaków.
Kiedy wybrać funkcję, a kiedy procedurę?
Funkcje są łatwiejsze w użyciu, ich wynik można przypisać do zmiennej, ale nie modyfikują danych i bywają wolne. Procedury potrafią modyfikować dane, wykonywać dynamiczny SQL, przechwytywać błędy i zwracać wiele wyników.
Ile poziomów rekurencji dopuszcza funkcja w SQL Server?
Funkcja może wywołać sama siebie, ale w SQL Server jesteśmy ograniczeni do maksymalnie 32 poziomów rekurencji. Dopisek WITH RETURNS NULL ON NULL INPUT sprawia, że przy wejściu null funkcja od razu zwraca null bez obliczeń.

Komentarze (0)

Musisz być zalogowany by móc dodać komentarz. Zaloguj się przez Google

Brak komentarzy...