Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Créer une fonction table dans SQL Server

Vous pouvez créer une fonction table (TVF) dans SQL Server à l'aide de CREATE FUNCTION Syntaxe T-SQL.

La syntaxe est légèrement différente selon que vous créez une fonction table inline (ITVF) ou une fonction table multi-instructions (MSTVF).

Exemple 1 – Fonction de table en ligne

Voici un exemple de fonction table en ligne.

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

Nous pouvons dire qu'il s'agit d'une fonction table en ligne, car elle ne spécifie pas la structure de la table de retour. Il indique simplement RETURNS TABLE , puis s'appuie sur le SELECT pour déterminer la structure de la table de retour.

Dans ce cas, la fonction nécessite que l'ID de genre soit passé en argument.

Voir Créer une fonction table en ligne pour des exemples d'ajout d'options telles que la liaison de schéma et le chiffrement.

La liaison de schéma est généralement une bonne idée, car elle empêchera toute modification défavorable des objets sous-jacents auxquels la fonction fait référence.

Exemple 2 - Fonction table multi-instructions

Voici comment nous écririons la fonction si nous voulions qu'elle soit une fonction table à plusieurs instructions.

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

Dans ce cas, nous utilisons une variable de type table appelé @Albums et nous spécifions explicitement la structure de la table de retour. Les résultats de la requête sont stockés dans cette variable, qui est ensuite renvoyée lorsque la fonction est invoquée.

L'un des avantages des MSTVF est qu'ils peuvent contenir plusieurs instructions. Le voici à nouveau avec une partie supplémentaire ajoutée à la fin.

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

Voir Créer une fonction table multi-instructions pour des exemples d'ajout d'options telles que la liaison de schéma et le chiffrement.