Podsumowanie: w tym poradniku dowiesz się jak używać funkcji tabelarycznych SQL Server, włączając w to funkcje tabelaryczne inline oraz funkcje wielostanowiskowe.
Co to jest funkcja tabelaryczna w SQL Server
Funkcja tabelaryczna jest funkcją zdefiniowaną przez użytkownika, która zwraca dane typu tabelarycznego. Typem zwrotnym funkcji typu tabela-wartość jest tabela, dlatego możesz używać funkcji typu tabela-wartość tak samo, jak używałbyś tabeli.
Tworzenie funkcji wartościowanej tabelarycznie
Następujący przykład instrukcji tworzy funkcję wartościowaną tabelarycznie, która zwraca listę produktów zawierającą nazwę produktu, rok modelu i cenę katalogową dla określonego roku modelu:
Code language: SQL (Structured Query Language) (sql)CREATE FUNCTION udfProductInYear ( @model_year INT)RETURNS TABLEASRETURN SELECT product_name, model_year, list_price FROM production.products WHERE model_year = @model_year;
Składnia jest podobna do tej, która tworzy funkcję zdefiniowaną przez użytkownika.
RETURNS TABLE
określa, że funkcja będzie zwracać tablicę. Jak widać, nie ma tu żadnej instrukcji BEGIN...END
. Instrukcja po prostu odpytuje dane z tabeli production.products
.
Funkcja udfProductInYear
przyjmuje jeden parametr o nazwie @model_year
typu INT
. Zwraca ona produkty, których lata modelowe są równe parametrowi @model_year
.
Po utworzeniu funkcji tabelowo-wartościowej, można ją znaleźć w zakładce Programmability > Functions > Table-valued Functions, jak na poniższym rysunku:
Powyższa funkcja zwraca zbiór wyników pojedynczej SELECT
instrukcji, dlatego znana jest również jako inline table-valued function.
Wykonanie funkcji wartościowanej tabelarycznie
Aby wykonać funkcję wartościowaną tabelarycznie, używamy jej w klauzuli FROM
instrukcji SELECT
:
Code language: SQL (Structured Query Language) (sql)SELECT * FROM udfProductInYear(2017);
W tym przykładzie wybraliśmy produkty, których rok modelowy to 2017
.
Można również określić, które kolumny mają zostać zwrócone z funkcji wartości tabelarycznej w następujący sposób:
Code language: SQL (Structured Query Language) (sql)SELECT product_name, list_priceFROM udfProductInYear(2018);
Tutaj znajduje się częściowe wyjście:
Modyfikowanie funkcji tabelowo-wartościowej
Aby zmodyfikować funkcję tabelowo-wartościową, używamy słowa kluczowego ALTER
zamiast CREATE
. Pozostała część skryptu jest taka sama.
Na przykład poniższa instrukcja modyfikuje funkcję udfProductInYear
przez zmianę istniejącego parametru i dodanie jeszcze jednego parametru:
Code language: SQL (Structured Query Language) (sql)ALTER FUNCTION udfProductInYear ( @start_year INT, @end_year INT)RETURNS TABLEASRETURN SELECT product_name, model_year, list_price FROM production.products WHERE model_year BETWEEN @start_year AND @end_year
Funkcja udfProductInYear
zwraca teraz produkty, których rok modelowy mieści się między rokiem początkowym a rokiem końcowym.
Poniższa instrukcja wywołuje funkcję udfProductInYear
, aby uzyskać produkty, których lata modelowe znajdują się pomiędzy 2017
a 2018
:
Code language: SQL (Structured Query Language) (sql)SELECT product_name, model_year, list_priceFROM udfProductInYear(2017,2018)ORDER BY product_name;
Tutaj znajduje się częściowe wyjście:
Multi-statement table-wartości tabelaryczne (MSTVF)
Wielostanowiskowa funkcja tabelaryczna lub MSTVF jest funkcją tabelaryczną, która zwraca wynik wielu poleceń.
Wielostanowiskowa funkcja tabelowo-wartościowa jest bardzo użyteczna, ponieważ można wykonać wiele zapytań w ramach funkcji i agregować wyniki w zwracanej tabeli.
Aby zdefiniować wielostanowiskową funkcję tabelowo-wartościową, używamy zmiennej tabelarycznej jako wartości zwracanej. Wewnątrz funkcji wykonujemy jedno lub więcej zapytań i wstawiamy dane do tej zmiennej tabeli.
Następująca funkcja udfContacts()
łączy pracowników i klientów w pojedynczą listę kontaktów:
Code language: SQL (Structured Query Language) (sql)CREATE FUNCTION udfContacts() RETURNS @contacts TABLE ( first_name VARCHAR(50), last_name VARCHAR(50), email VARCHAR(255), phone VARCHAR(25), contact_type VARCHAR(20) )ASBEGIN INSERT INTO @contacts SELECT first_name, last_name, email, phone, 'Staff' FROM sales.staffs; INSERT INTO @contacts SELECT first_name, last_name, email, phone, 'Customer' FROM sales.customers; RETURN;END;
Następujące wyrażenie ilustruje sposób wykonania wielostanowiskowej funkcji tabelaryczno-wartościowej udfContacts
:
Code language: SQL (Structured Query Language) (sql)SELECT * FROM udfContacts();
Wyjście:
Kiedy używać funkcji table-valued
Funkcji table-valued używamy zazwyczaj jako sparametryzowanych widoków. W porównaniu z procedurami przechowywanymi, funkcje tabelaryczne są bardziej elastyczne, ponieważ możemy ich używać wszędzie tam, gdzie używane są tabele.
W tym poradniku dowiedziałeś się o funkcjach tabelarycznych SQL Server, w tym o funkcjach tabelarycznych inline i funkcjach tabelarycznych wielostanowiskowych.
W tym poradniku dowiedziałeś się o funkcjach tabelarycznych SQL Server, w tym o funkcjach tabelarycznych inline i funkcjach tabelarycznych wielostanowiskowych.