U kunt een functie met tabelwaarde (TVF) maken in SQL Server met behulp van de CREATE FUNCTION T-SQL-syntaxis.
De syntaxis verschilt enigszins, afhankelijk van of u een inline tabelwaardefunctie (ITVF) of een multi-statement tabelwaardefunctie (MSTVF) maakt.
Voorbeeld 1 – Inline tabel gewaardeerde functie
Hier is een voorbeeld van een inline functie met tabelwaarde.
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
We kunnen zien dat dit een inline-tabelwaardefunctie is, omdat deze de structuur van de retourtabel niet specificeert. Er staat gewoon RETURNS TABLE , en vertrouwt vervolgens op de SELECT statement om de structuur van de retourtabel te bepalen.
In dit geval vereist de functie dat het genre-ID als argument wordt doorgegeven.
Zie Een inline-tabelwaarde-functie maken voor voorbeelden van het toevoegen van opties zoals schemabinding en versleuteling.
Schemabinding is meestal een goed idee, omdat het voorkomt dat er nadelige wijzigingen worden aangebracht in de onderliggende objecten waarnaar de functie verwijst.
Voorbeeld 2 – Multi-statement tabel gewaardeerde functie
Hier is hoe we de functie zouden schrijven als we wilden dat het een multi-statement tabelwaardefunctie zou zijn.
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
In dit geval gebruiken we een variabele van het type tabel genaamd @Albums en we specificeren expliciet de structuur van de retourtabel. De queryresultaten worden opgeslagen in die variabele, die vervolgens wordt geretourneerd wanneer de functie wordt aangeroepen.
Een van de voordelen van MSTVF's is dat ze meerdere verklaringen kunnen bevatten. Hier is het weer met een extra deel toegevoegd aan het einde.
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
Zie Een multi-statement tabelwaardefunctie maken voor voorbeelden van het toevoegen van opties zoals schemabinding en versleuteling.