sql >> Database teknologi >  >> RDS >> Sqlserver

Hvad er en funktion med tabelværdi i SQL Server?

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ølgende SELECT 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

  1. Oracle Database BLOB til InputStream i Java?

  2. Udforsk de forskellige måder at kryptere dine MariaDB-data på

  3. Om nytten af ​​udtryksindekser

  4. Asynkron replikering automatisk failover i MySQL 8.0.22