Funkcję z wartościami przechowywanymi w tabeli (TVF) można utworzyć w programie SQL Server przy użyciu CREATE FUNCTION
Składnia T-SQL.
Składnia jest nieco inna w zależności od tego, czy tworzysz wbudowaną funkcję z wartościami tabelarycznymi (ITVF), czy wieloinstrukcyjną funkcję z wartościami tabelarycznymi (MSTVF).
Przykład 1 — Wbudowana funkcja z wartościami tabelarycznymi
Oto przykład wbudowanej funkcji z wartościami tabelarycznymi.
CREATE FUNCTION dbo.ufn_AlbumsByGenre_ITVF(@GenreId int) RETURNS TABLE AS RETURN( SELECT ar.ArtistName, al.AlbumName, g.Genre FROM Genres g INNER JOIN Albums al ON g.GenreId = al.GenreId INNER JOIN Artists ar ON al.ArtistId = ar.ArtistId WHERE g.GenreId = @GenreId ); GO
Możemy powiedzieć, że jest to wbudowana funkcja z wartościami tabelarycznymi, ponieważ nie określa struktury tabeli zwracanej. Po prostu stwierdza RETURNS TABLE
, a następnie polega na SELECT
instrukcja do określenia struktury tabeli zwrotów.
W takim przypadku funkcja wymaga przekazania identyfikatora gatunku jako argumentu.
Zobacz Tworzenie wbudowanej funkcji z wartościami przechowywanymi w tabeli, aby zapoznać się z przykładami dodawania opcji, takich jak powiązanie schematu i szyfrowanie.
Wiązanie schematu jest zwykle dobrym pomysłem, ponieważ zapobiega wprowadzaniu niepożądanych zmian w podstawowych obiektach, do których odwołuje się funkcja.
Przykład 2 – Wielowyrazowa funkcja z wartościami tabelarycznymi
Oto, jak napisalibyśmy funkcję, gdybyśmy chcieli, aby była to wieloinstrukcyjna funkcja z wartościami w tabeli.
CREATE FUNCTION dbo.ufn_AlbumsByGenre_MSTVF(@GenreId int) RETURNS @Albums TABLE ( ArtistName nvarchar(255), AlbumName nvarchar(255), Genre nvarchar(50) ) AS BEGIN INSERT INTO @Albums SELECT ar.ArtistName, al.AlbumName, g.Genre FROM Genres g INNER JOIN Albums al ON g.GenreId = al.GenreId INNER JOIN Artists ar ON al.ArtistId = ar.ArtistId WHERE g.GenreId = @GenreId RETURN END GO
W tym przypadku używamy zmiennej typu tabela o nazwie @Albums
i wyraźnie określamy strukturę tabeli zwrotów. Wyniki zapytania są przechowywane w tej zmiennej, która jest następnie zwracana po wywołaniu funkcji.
Jedną z zalet MSTVF jest to, że mogą zawierać wiele instrukcji. Tutaj znowu z dodatkową częścią dodaną na końcu.
CREATE FUNCTION dbo.ufn_AlbumsByGenre_MSTVF(@GenreId int) RETURNS @Albums TABLE ( ArtistName nvarchar(255), AlbumName nvarchar(255), Genre nvarchar(50) ) AS BEGIN INSERT INTO @Albums SELECT ar.ArtistName, al.AlbumName, g.Genre FROM Genres g INNER JOIN Albums al ON g.GenreId = al.GenreId INNER JOIN Artists ar ON al.ArtistId = ar.ArtistId WHERE g.GenreId = @GenreId IF @@ROWCOUNT = 0 BEGIN INSERT INTO @Albums VALUES ( 'None', 'None', 'None' ) END RETURN END GO
Zobacz Tworzenie funkcji wielowyrazowej z wartościami przechowywanymi w tabeli, aby zapoznać się z przykładami dodawania opcji, takich jak powiązanie schematu i szyfrowanie.