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.