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.