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.