sql >> Databáze >  >> RDS >> Sqlserver

Vytvořte funkci s hodnotou tabulky na serveru SQL Server

Na serveru SQL Server můžete vytvořit funkci s hodnotou tabulky (TVF) pomocí CREATE FUNCTION Syntaxe T-SQL.

Syntaxe se mírně liší v závislosti na tom, zda vytváříte inline tabulkovou funkci (ITVF) nebo vícepříkazovou tabulkovou funkci (MSTVF).

Příklad 1 – Inline Table-Valued Function

Zde je příklad funkce vložené tabulky s hodnotou.

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

Můžeme říci, že se jedná o inline funkci s hodnotou tabulky, protože neurčuje strukturu návratové tabulky. Jednoduše uvádí RETURNS TABLE , pak se spoléhá na SELECT k určení struktury návratové tabulky.

V tomto případě funkce vyžaduje, aby bylo ID žánru předáno jako argument.

Příklady přidání možností, jako je vazba schématu a šifrování, najdete v části Vytvoření funkce s hodnotou vložené tabulky.

Vazba schématu je obvykle dobrý nápad, protože zabrání jakýmkoli nepříznivým změnám v podkladových objektech, na které funkce odkazuje.

Příklad 2 – Funkce s tabulkovou hodnotou s více příkazy

Zde je návod, jak bychom funkci napsali, pokud bychom chtěli, aby to byla vícepříkazová funkce s tabulkovou hodnotou.

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

V tomto případě použijeme proměnnou typu table s názvem @Albums a explicitně specifikujeme strukturu návratové tabulky. Výsledky dotazu jsou uloženy v této proměnné, která je poté vrácena při vyvolání funkce.

Jednou z výhod MSTVF je, že mohou obsahovat více příkazů. Tady je to znovu s extra částí přidanou na konec.

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

Příklady přidávání voleb, jako je vazba schématu a šifrování, najdete v části Vytvoření funkce s tabulkovou hodnotou s více příkazy.


  1. Jak zkontrolovat, zda existuje databáze na serveru SQL?

  2. Ukázková databáze MySQL

  3. SQL:Pokud jde o NOT IN a NOT EQUAL TO, co je efektivnější a proč?

  4. Jak zkopírovat ze souboru CSV do tabulky PostgreSQL s hlavičkami v souboru CSV?