Du kan oprette en tabelværdi-funktion (TVF) i SQL Server ved hjælp af CREATE FUNCTION
T-SQL-syntaks.
Syntaksen er en smule anderledes afhængigt af, om du opretter en indlejret tabel-værdi-funktion (ITVF) eller en multi-sætning tabel-værdi-funktion (MSTVF).
Eksempel 1 – Inline-tabel-vurderet funktion
Her er et eksempel på en inline-tabel-vurderet funktion.
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
Vi kan se, at dette er en inline-tabelværdieret funktion, fordi den ikke specificerer strukturen af returtabellen. Den siger blot RETURNS TABLE
, så stoler på SELECT
sætning for at bestemme returtabellens struktur.
I dette tilfælde kræver funktionen, at genre-id'et sendes ind som et argument.
Se Opret en inline-tabel-værdisat funktion for eksempler på tilføjelse af muligheder såsom skemabinding og kryptering.
Skemabinding er normalt en god idé, da det vil forhindre, at der foretages uønskede ændringer af de underliggende objekter, som funktionen refererer til.
Eksempel 2 – Multi-erklærings-tabel-værdi-funktion
Her er, hvordan vi ville skrive funktionen, hvis vi ønskede, at den skulle være en funktion med flere sætninger i tabelværdier.
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
I dette tilfælde bruger vi en variabel af typen tabel kaldet @Albums
og vi specificerer eksplicit strukturen af returtabellen. Forespørgselsresultaterne gemmes i denne variabel, som derefter returneres, når funktionen aktiveres.
En af fordelene ved MSTVF'er er, at de kan indeholde flere udsagn. Her er den igen med en ekstra del tilføjet til sidst.
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
Se Opret en funktion med flere erklæringer med tabelværdi for eksempler på tilføjelse af muligheder såsom skemabinding og kryptering.