I SQL Server, den indbyggede tabelværdi-funktion er en af to typer Transact-SQL-tabelværdier-funktioner (den anden type er tabelværdi-funktionen med flere sætninger).
Table-valued functions (TVF) er en type brugerdefineret funktion, der returnerer deres resultater som en tabel. De kan derfor forespørges ligesom en normal tabel.
Inline TVF'er (nogle gange omtalt som ITVF'er) har ikke tilknyttede returvariabler. Returværdien er defineret gennem en enkelt SELECT
udmelding. Denne erklæring definerer strukturen af returtabellen. Dette er i modsætning til TVF'er med flere sætninger (også kaldet MSTVF'er), som kræver en returvariabel.
ITVF'er bruger heller ikke BEGIN
/END
syntaks, hvilket er en anden ting, der adskiller dem fra MSTVF'er.
Inline TVF'er anses ofte for at have bedre ydeevne i forhold til multi-statement TVF'er, selvom dette også vil afhænge af, hvad du forsøger at gøre i funktionen.
Eksempel på en inline-tabel-vurderet funktion
Her er et eksempel på en grundlæggende 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 grundlæggende af en SELECT
erklæring pakket ind i en anden kode. For specifikt at gøre det til en inline TVF, jeg startede funktionen med RETURNS TABLE
, tæt efterfulgt af RETURN
, og slutter med en SELECT
udsagn inden for parentes.
Flere udsagn
Selvom inline tabelværdierede funktioner ikke er designet til flere SELECT
sætninger (det er hvad MSTVF'er er til), er det muligt at bruge UNION
operator for at kombinere resultatsættet af flere udsagn.
Eksempel:
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
Funktionsmuligheder
Du kan også specificere ting som, om du vil bruge skemabinding eller ej (det burde du nok) og om du vil kryptere funktionen eller ej.
Skemabinding vil forhindre, at der foretages uønskede ændringer af de underliggende objekter, som funktionen afhænger af (såsom at droppe en tabel, ændre en kolonne osv.).
Kryptering vil konvertere funktionens definition til et sløret format (for at forhindre andre i at kunne læse det).
Se Opret en inline-tabel-værdisat funktion for eksempler på tilføjelse af skemabinding og kryptering til en ITVF.