sql >> Databasteknik >  >> RDS >> Sqlserver

Skapa en tabellvärderad funktion i SQL Server

Du kan skapa en tabellvärderad funktion (TVF) i SQL Server med CREATE FUNCTION T-SQL-syntax.

Syntaxen är något annorlunda beroende på om du skapar en inline-tabellvärderad funktion (ITVF) eller en multi-statement-tabellvärderad funktion (MSTVF).

Exempel 1 – Inline tabellvärderad funktion

Här är ett exempel på en inline-tabellvärderad 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 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 genre-ID:t 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 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 det här fallet använder vi en variabel av typen tabell kallas @Albums och vi specificerar uttryckligen strukturen för returtabellen. Frågeresultaten lagras i den variabeln, som sedan returneras när funktionen anropas.

En av fördelarna med MSTVF är att de kan innehålla flera påståenden. Här är den igen med en extra del tillagd på slutet.

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 Skapa en tabellvärderad funktion med flera uttalanden för exempel på att lägga till alternativ som schemabindning och kryptering.


  1. ORA-12705:Kan inte komma åt NLS-datafiler eller ogiltig miljö

  2. Varför behöver en oracle plsql varchar2-variabel en storlek men inte en parameter?

  3. NCHR() Funktion i Oracle

  4. Ändra precisionen för numerisk kolumn i Oracle