sql >> Database >  >> RDS >> Sqlserver

Een functie met tabelwaarde maken in SQL Server

U kunt een functie met tabelwaarde (TVF) maken in SQL Server met behulp van de CREATE FUNCTION T-SQL-syntaxis.

De syntaxis verschilt enigszins, afhankelijk van of u een inline tabelwaardefunctie (ITVF) of een multi-statement tabelwaardefunctie (MSTVF) maakt.

Voorbeeld 1 – Inline tabel gewaardeerde functie

Hier is een voorbeeld van een inline functie met tabelwaarde.

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

We kunnen zien dat dit een inline-tabelwaardefunctie is, omdat deze de structuur van de retourtabel niet specificeert. Er staat gewoon RETURNS TABLE , en vertrouwt vervolgens op de SELECT statement om de structuur van de retourtabel te bepalen.

In dit geval vereist de functie dat het genre-ID als argument wordt doorgegeven.

Zie Een inline-tabelwaarde-functie maken voor voorbeelden van het toevoegen van opties zoals schemabinding en versleuteling.

Schemabinding is meestal een goed idee, omdat het voorkomt dat er nadelige wijzigingen worden aangebracht in de onderliggende objecten waarnaar de functie verwijst.

Voorbeeld 2 – Multi-statement tabel gewaardeerde functie

Hier is hoe we de functie zouden schrijven als we wilden dat het een multi-statement tabelwaardefunctie zou zijn.

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

In dit geval gebruiken we een variabele van het type tabel genaamd @Albums en we specificeren expliciet de structuur van de retourtabel. De queryresultaten worden opgeslagen in die variabele, die vervolgens wordt geretourneerd wanneer de functie wordt aangeroepen.

Een van de voordelen van MSTVF's is dat ze meerdere verklaringen kunnen bevatten. Hier is het weer met een extra deel toegevoegd aan het einde.

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

Zie Een multi-statement tabelwaardefunctie maken voor voorbeelden van het toevoegen van opties zoals schemabinding en versleuteling.


  1. Bijgewerkte Azure SQL Database Tier-opties

  2. Hoe PgBackRest te installeren

  3. MySQL ATAN2() Functie – Retourneer de boogtangens van 2 waarden

  4. Wijzigingen in de replicatietopologie uitvoeren voor PostgreSQL