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.