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

Opret en funktion med tabelværdi i SQL Server

Du kan oprette en tabelværdi-funktion (TVF) i SQL Server ved hjælp af CREATE FUNCTION T-SQL-syntaks.

Syntaksen er en smule anderledes afhængigt af, om du opretter en indlejret tabel-værdi-funktion (ITVF) eller en multi-sætning tabel-værdi-funktion (MSTVF).

Eksempel 1 – Inline-tabel-vurderet funktion

Her er et eksempel på en inline-tabel-vurderet funktion.

CREATE FUNCTION dbo.ufn_AlbumsByGenre_ITVF(@GenreId int)
RETURNS TABLE
AS
RETURN(  
    SELECT 
      ar.ArtistName,
      al.AlbumName,
      g.Genre
    FROM Genres g 
      INNER JOIN Albums al
        ON g.GenreId = al.GenreId 
      INNER JOIN Artists ar 
        ON al.ArtistId = ar.ArtistId
    WHERE g.GenreId = @GenreId
);
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 genre-id'et sendes ind som et argument.

Se Opret en inline-tabel-værdisat 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 dbo.ufn_AlbumsByGenre_MSTVF(@GenreId int)
RETURNS @Albums TABLE (
	ArtistName nvarchar(255),
	AlbumName nvarchar(255),
	Genre nvarchar(50)
	)
AS
BEGIN
    INSERT INTO @Albums
    SELECT 
        ar.ArtistName,
        al.AlbumName,
        g.Genre
    FROM Genres g 
        INNER JOIN Albums al
        ON g.GenreId = al.GenreId 
        INNER JOIN Artists ar 
        ON al.ArtistId = ar.ArtistId
    WHERE g.GenreId = @GenreId

    RETURN
END
GO

I dette tilfælde bruger vi en variabel af typen tabel kaldet @Albums og vi specificerer eksplicit strukturen af ​​returtabellen. Forespørgselsresultaterne gemmes i denne variabel, som derefter returneres, når funktionen aktiveres.

En af fordelene ved MSTVF'er er, at de kan indeholde flere udsagn. Her er den igen med en ekstra del tilføjet til sidst.

CREATE FUNCTION dbo.ufn_AlbumsByGenre_MSTVF(@GenreId int)
RETURNS @Albums TABLE (
	ArtistName nvarchar(255),
	AlbumName nvarchar(255),
	Genre nvarchar(50)
	)
AS
BEGIN
    INSERT INTO @Albums
    SELECT 
        ar.ArtistName,
        al.AlbumName,
        g.Genre
    FROM Genres g 
        INNER JOIN Albums al
        ON g.GenreId = al.GenreId 
        INNER JOIN Artists ar 
        ON al.ArtistId = ar.ArtistId
    WHERE g.GenreId = @GenreId
 
    IF @@ROWCOUNT = 0
    BEGIN
        INSERT INTO @Albums
        VALUES (
            'None',
            'None',
            'None'
            )
    END

    RETURN
END
GO

Se Opret en funktion med flere erklæringer med tabelværdi for eksempler på tilføjelse af muligheder såsom skemabinding og kryptering.


  1. ClusterControl - Advanced Backup Management - mariabackup del I

  2. Hvordan man behandler MAX() af en tom tabel som 0 i stedet for NULL

  3. Benchmarking Managed PostgreSQL Cloud Solutions - Google Cloud:Tredje del

  4. Hvordan får jeg oplysninger om en indeks- og tabelejer i Oracle?