I SQL Server, den inline-tabellvärderade funktionen är en av två typer av Transact-SQL-tabellvärderade funktioner (den andra typen är tabellvärderade funktioner med flera påståenden).
Table-valued functions (TVF) är en typ av användardefinierad funktion som returnerar sina resultat som en tabell. De kan därför frågas precis som en vanlig tabell.
Inline TVFs (ibland kallade ITVFs) har inte associerade returvariabler. Returvärdet definieras genom en enda SELECT
påstående. Detta uttalande definierar strukturen för returtabellen. Detta till skillnad från TVF:er med flera påståenden (även kallade MTVFs), som kräver en returvariabel.
ITVF:er använder inte heller BEGIN
/END
syntax, vilket är en annan sak som skiljer dem från MSTVFs.
Inline TVF anses ofta ha bättre prestanda jämfört med multi-statement TVF, även om detta också beror på vad du försöker göra i funktionen.
Exempel på en inline-tabellvärderad funktion
Här är ett exempel på en grundläggande 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
Den består i princip av en SELECT
uttalande insvept i någon annan kod. För att specifikt göra det till en inline TVF, jag startade funktionen med RETURNS TABLE
, tätt följt av RETURN
, och slutar med en SELECT
uttalande inom parentes.
Flera uttalanden
Även om inline-tabellvärdade funktioner inte är designade för flera SELECT
uttalanden (det är vad MSTVF är till för), är det möjligt att använda UNION
operatorn för att kombinera resultatuppsättningen av flera satser.
Exempel:
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
Funktionsalternativ
Du kan också specificera saker som om du ska använda schemabindning eller inte (det borde du förmodligen) och om du ska kryptera funktionen eller inte.
Schemabindning kommer att förhindra att några negativa ändringar görs av de underliggande objekten som funktionen beror på (som att ta bort en tabell, ändra en kolumn, etc).
Kryptering kommer att konvertera funktionens definition till ett obfuskerat format (för att förhindra att andra kan läsa den).
Se Skapa en inline tabellvärderad funktion för exempel på hur man lägger till schemabindning och kryptering till en ITVF.