In SQL Server is de inline tabelwaardefunctie is een van de twee typen Transact-SQL-tabelwaardefuncties (het andere type is de multi-statement tabelwaardefunctie).
Tabelwaardefuncties (TVF) zijn een type door de gebruiker gedefinieerde functie waarvan de resultaten als een tabel worden geretourneerd. Ze kunnen dus net als een normale tabel worden opgevraagd.
Inline TVF's (ook wel ITVF's genoemd) hebben geen bijbehorende retourvariabelen. De retourwaarde wordt gedefinieerd via een enkele SELECT uitspraak. Deze instructie definieert de structuur van de retourtabel. Dit in tegenstelling tot multi-statement TVF's (ook wel MSTVF's genoemd), die wel een retourvariabele vereisen.
ITVF's gebruiken ook niet de BEGIN /END syntaxis, wat nog iets is dat ze onderscheidt van MSTVF's.
Inline TVF's worden vaak beschouwd als betere prestaties dan TVF's met meerdere instructies, hoewel dit ook afhangt van wat u in de functie probeert te doen.
Voorbeeld van een inline tabel gewaardeerde functie
Hier is een voorbeeld van een standaard ITVF:
CREATE FUNCTION dbo.ufn_AlbumsByArtist(@ArtistId int)
RETURNS TABLE
AS
RETURN (
SELECT
al.ArtistId,
al.AlbumName,
g.Genre
FROM dbo.Albums al
INNER JOIN dbo.Artists ar
ON al.ArtistId = ar.ArtistId
INNER JOIN Genres g
ON al.GenreId = g.GenreId
WHERE al.ArtistId = @ArtistId
);
GO
Het bestaat in feite uit een SELECT statement verpakt in een andere code. Om er specifiek een inline van te maken TVF, ik heb de functie gestart met RETURNS TABLE , op de voet gevolgd door RETURN , en eindigend met een SELECT verklaring tussen haakjes.
Meerdere uitspraken
Hoewel inline-tabelwaardefuncties niet zijn ontworpen voor meerdere SELECT statements (daar zijn MSTVF's voor), is het mogelijk om de UNION operator om de resultatenset van meerdere instructies te combineren.
Voorbeeld:
CREATE FUNCTION [dbo].[udf_PetsByName_ITVF]( @PetName varchar(70))
RETURNS TABLE
AS
RETURN (
SELECT
CONCAT('Cat', ' ', CatId) AS PetId,
CatName
FROM dbo.Cats
WHERE CatName = @PetName
UNION ALL
SELECT
CONCAT('Dog', ' ', DogId) AS PetId,
DogName
FROM dbo.Dogs
WHERE DogName = @PetName
);
GO
Functie-opties
Je kunt ook dingen specificeren zoals of je wel of niet schemabinding wilt gebruiken (waarschijnlijk zou je dat moeten doen) en of de functie wel of niet moet worden versleuteld.
Schemabinding voorkomt dat er nadelige wijzigingen worden aangebracht in de onderliggende objecten waarvan de functie afhankelijk is (zoals het laten vallen van een tabel, het wijzigen van een kolom, enz.).
Versleuteling converteert de definitie van de functie naar een versluierd formaat (om te voorkomen dat anderen het kunnen lezen).
Zie Create an Inline Table-Valued Function voor voorbeelden van het toevoegen van schemabinding en encryptie aan een ITVF.