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.