I SQL Server, en tabellvärderad funktion (TVF) är en användardefinierad funktion som returnerar en tabell. Detta till skillnad från en skalär funktion, som returnerar ett enda värde.
Du kan anropa en tabellvärderad funktion på samma sätt som du kan fråga en tabell. Du kan till exempel använda den i en SELECT
påstående. I vissa fall kan tabellvärdade funktioner också användas för att uppdatera, ta bort och infoga data.
Typer av tabellvärderade funktioner
När du skapar en tabellvärderad funktion kan du välja att skapa en Transact-SQL-tabellvärderad funktion eller en tabellvärderad funktion för Common Language Runtime (CLR).
Transact-SQL-tabellvärderade funktioner
Transact-SQL TVF kan vara något av följande:
- Inline Table-Valued Function (ITVF)
- När du skapar en ITVF startar du funktionsdefinitionen med
RETURNS TABLE
, och den efterföljandeSELECT
satsen definierar strukturen för returtabellen. - Multi-Statement Table-Valued Function (MSTVF)
- En tabellvärderad funktion med flera påståenden kan innehålla flera påståenden, vars resultat sparas i en variabel som du deklarerar i början av funktionen. När du gör detta anger du uttryckligen strukturen för returtabellen.
CLR-tabellvärderade funktioner
Ur CLR-perspektivet liknar syntaxen T-SQL ITVF, men något annorlunda. Du anger uttryckligen strukturen för returtabellen, men du deklarerar inte en returvariabel.
CLR-tabellvärdade funktioner implementeras som metoder på en klass i en Microsoft .NET Framework-sammansättning.
För en mer detaljerad översikt av CLR TVF, se Microsofts dokumentation för CLR-tabellvärderade funktioner.
Exempel 1 – Inline tabellvärderad funktion
Här är ett exempel på T-SQL-koden som används för att skapa en inline-tabellvärderad 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 säga att detta är en inline-tabellvärderad funktion, eftersom den inte specificerar strukturen för returtabellen. Det står helt enkelt RETURNS TABLE
, förlitar sig sedan på SELECT
för att bestämma returtabellens struktur.
I det här fallet kräver funktionen att kattens namn skickas in som ett argument.
Se Skapa en inline tabellvärderad funktion för exempel på att lägga till alternativ som schemabindning och kryptering.
Schemabindning är vanligtvis en bra idé, eftersom det kommer att förhindra att några negativa ändringar görs på de underliggande objekten som funktionen refererar till.
Exempel 2 – Multi-Statement Tabell-värderad funktion
Så här skulle vi skriva funktionen om vi ville att den skulle vara en tabellvärderad funktion med flera påståenden.
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 det här fallet använder vi en variabel av typen tabell kallas @cats
och vi specificerar uttryckligen strukturen för returtabellen. Frågeresultaten lagras i den variabeln, som sedan returneras när funktionen anropas.
Det här exemplet gör inte MSTVFs mycket rättvisa, eftersom jag bara inkluderar ett enda uttalande. Huvudpoängen med MTVF:er är att du kan inkludera flera satser, och du kan lägga till utdata från dessa satser till returvariabeln.
Se Skapa en tabellvärderad funktion med flera uttalanden för ett exempel på hur du använder flera satser, samt exempel på att lägga till alternativ som schemabindning och kryptering.
Exempel 3 – Välj data från våra tabellvärderade funktioner
Så nu när vi har skapat våra funktioner kan vi anropa dem båda med en SELECT
påstående.
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 och MSTVF anropades med samma syntax och båda gav samma resultat.
Anropar tabellvärderade funktioner
Tabellvärdade funktioner kan anropas där tabelluttryck är tillåtna i FROM
sats av SELECT
, INSERT
, UPDATE
, eller DELETE
uttalanden.
Det betyder att du kan välja data, infoga data, uppdatera data och till och med ta bort data via en tabellvärderad funktion.
Här är artiklar som visar var och en:
- Välj data via en tabellvärderad funktion
- Uppdatera data via en tabellvärderad funktion
- Infoga data via en tabellvärderad funktion
- Ta bort data via en tabellvärderad funktion