Du kan skapa en tabellvärderad funktion (TVF) i SQL Server med CREATE FUNCTION
T-SQL-syntax.
Syntaxen är något annorlunda beroende på om du skapar en inline-tabellvärderad funktion (ITVF) eller en multi-statement-tabellvärderad funktion (MSTVF).
Exempel 1 – Inline tabellvärderad funktion
Här är ett exempel på en inline-tabellvärderad 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 säga att detta är en inline-tabellvärderad funktion, eftersom den inte specificerar strukturen för returtabellen. Det står helt enkelt RETURNS TABLE
, förlitar sig sedan på SELECT
för att bestämma returtabellens struktur.
I det här fallet kräver funktionen att genre-ID:t skickas in som ett argument.
Se Skapa en inline tabellvärderad funktion för exempel på att lägga till alternativ som schemabindning och kryptering.
Schemabindning är vanligtvis en bra idé, eftersom det kommer att förhindra att några negativa ändringar görs på de underliggande objekten som funktionen refererar till.
Exempel 2 – Multi-Statement Tabell-värderad funktion
Så här skulle vi skriva funktionen om vi ville att den skulle vara en tabellvärderad funktion med flera påståenden.
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 det här fallet använder vi en variabel av typen tabell kallas @Albums
och vi specificerar uttryckligen strukturen för returtabellen. Frågeresultaten lagras i den variabeln, som sedan returneras när funktionen anropas.
En av fördelarna med MSTVF är att de kan innehålla flera påståenden. Här är den igen med en extra del tillagd på slutet.
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 Skapa en tabellvärderad funktion med flera uttalanden för exempel på att lägga till alternativ som schemabindning och kryptering.