sql >> Databasteknik >  >> RDS >> Sqlserver

Vad är en tabellvärderad funktion i SQL Server?

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öljande SELECT 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

  1. Hur pg_sleep() fungerar i PostgreSQL

  2. Hur man beräknar skillnaden mellan två datum i SQLite

  3. Zombie PerfMon-räknare som aldrig dör!

  4. hur får man start- och slutdatum för alla veckor mellan två datum i SQL-servern?