I SQL Server, en tabel-værdi funktion (TVF) er en brugerdefineret funktion, der returnerer en tabel. Dette er i modsætning til en skalarfunktion, som returnerer en enkelt værdi.
Du kan påkalde en funktion med tabelværdi på samme måde, som du kan forespørge i en tabel. For eksempel kan du bruge det i en SELECT
udmelding. I nogle tilfælde kan tabelværdierede funktioner også bruges til at opdatere, slette og indsætte data.
Typer af tabelværdierede funktioner
Når du opretter en funktion med tabelværdi, har du valget mellem at oprette en Transact-SQL-tabel-værdi-funktion eller en tabel-værdi-værdi for Common Language Runtime (CLR).
Transact-SQL-tabelværdierede funktioner
Transact-SQL TVF'er kan være en af følgende:
- Inline Table-Valued Function (ITVF)
- Når du opretter en ITVF, starter du funktionsdefinitionen med
RETURNS TABLE
, og den efterfølgendeSELECT
sætning definerer strukturen af returtabellen. - Multi-Statement Table-Valued Function (MSTVF)
- En funktion med flere sætninger tabelværdier kan indeholde flere sætninger, hvis resultater gemmes i en variabel, som du erklærer i starten af funktionen. Når du gør dette, angiver du eksplicit strukturen af returtabellen.
CLR-tabelværdierede funktioner
Fra CLR-perspektivet ligner syntaksen T-SQL ITVF, men lidt anderledes. Du angiver eksplicit strukturen af returtabellen, men du erklærer ikke en returvariabel.
CLR-tabelværdierede funktioner implementeres som metoder på en klasse i en Microsoft .NET Framework-assembly.
For en mere detaljeret oversigt over CLR TVF'er, se Microsofts dokumentation for CLR Table-Valued Functions.
Eksempel 1 – Inline-tabel-vurderet funktion
Her er et eksempel på den T-SQL-kode, der bruges til at oprette en inline-tabelværdieret funktion.
CREATE FUNCTION dbo.udf_CatsByName_ITVF( @CatName varchar(70) ) RETURNS TABLE AS RETURN ( SELECT CatId, CatName, Phone FROM dbo.Cats WHERE CatName = @CatName ); GO
Vi kan se, at dette er en inline-tabelværdieret funktion, fordi den ikke specificerer strukturen af returtabellen. Den siger blot RETURNS TABLE
, så stoler på SELECT
sætning for at bestemme returtabellens struktur.
I dette tilfælde kræver funktionen, at kattens navn sendes ind som et argument.
Se Opret en inline-tabel-vurderet funktion for eksempler på tilføjelse af muligheder såsom skemabinding og kryptering.
Skemabinding er normalt en god idé, da det vil forhindre, at der foretages uønskede ændringer af de underliggende objekter, som funktionen refererer til.
Eksempel 2 – Multi-erklærings-tabel-værdi-funktion
Her er, hvordan vi ville skrive funktionen, hvis vi ønskede, at den skulle være en funktion med flere sætninger i tabelværdier.
CREATE FUNCTION udf_CatsByName_MSTVF( @CatName varchar(70) ) RETURNS @cats TABLE ( CatId int, CatName varchar(70), Phone varchar(10) ) AS BEGIN INSERT INTO @cats SELECT CatId, CatName, Phone FROM dbo.Cats WHERE CatName = @CatName; RETURN; END; GO
I dette tilfælde bruger vi en variabel af typen tabel kaldet @cats
og vi specificerer eksplicit strukturen af returtabellen. Forespørgselsresultaterne gemmes i denne variabel, som derefter returneres, når funktionen aktiveres.
Dette eksempel yder ikke MSTVFs megen retfærdighed, fordi jeg kun inkluderer et enkelt udsagn. Hovedpointen ved MSTVF'er er, at du kan inkludere flere udsagn, og du kan tilføje outputtet af disse udsagn til returvariablen.
Se Opret en funktion med flere erklæringer med tabelværdi for et eksempel på brug af flere sætninger samt eksempler på tilføjelse af muligheder såsom skemabinding og kryptering.
Eksempel 3 – Vælg data fra vores tabelværdierede funktioner
Så nu, hvor vi har oprettet vores funktioner, kan vi kalde dem begge ved hjælp af en SELECT
udmelding.
SELECT * FROM udf_CatsByName_ITVF('Tom'); SELECT * FROM udf_CatsByName_MSTVF('Tom');
Resultat:
+---------+-----------+------------+ | CatId | CatName | Phone | |---------+-----------+------------| | 3 | Tom | 7871237652 | +---------+-----------+------------+ (1 row affected) +---------+-----------+------------+ | CatId | CatName | Phone | |---------+-----------+------------| | 3 | Tom | 7871237652 | +---------+-----------+------------+ (1 row affected)
Både ITVF og MSTVF blev påkaldt ved hjælp af den samme syntaks, og begge returnerede det samme resultat.
Ankaldelse af tabelværdierede funktioner
Funktioner med tabelværdi kan aktiveres, hvor tabeludtryk er tilladt i FROM
klausul af SELECT
, INSERT
, UPDATE
eller DELETE
udsagn.
Det betyder, at du kan vælge data, indsætte data, opdatere data og endda slette data via en funktion med tabelværdi.
Her er artikler, der demonstrerer hver enkelt:
- Vælg data via en funktion med tabelværdi
- Opdater data via en funktion med tabelværdi
- Indsæt data via en funktion med tabelværdi
- Slet data via en funktion med tabelværdi