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

Creare una funzione con valori di tabella in SQL Server

È possibile creare una funzione con valori di tabella (TVF) in SQL Server utilizzando CREATE FUNCTION Sintassi T-SQL.

La sintassi è leggermente diversa a seconda che tu stia creando una funzione inline con valori di tabella (ITVF) o una funzione con valori di tabella multi-istruzione (MSTVF).

Esempio 1 – Funzione inline con valori di tabella

Ecco un esempio di una funzione inline con valori di tabella.

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

Possiamo dire che questa è una funzione inline con valori di tabella, perché non specifica la struttura della tabella di ritorno. Indica semplicemente RETURNS TABLE , quindi si basa su SELECT istruzione per determinare la struttura della tabella di ritorno.

In questo caso, la funzione richiede che l'ID del genere venga passato come argomento.

Vedere Creare una funzione inline con valori di tabella per esempi di aggiunta di opzioni come l'associazione di schemi e la crittografia.

L'associazione dello schema è in genere una buona idea, in quanto impedisce che vengano apportate modifiche negative agli oggetti sottostanti a cui fa riferimento la funzione.

Esempio 2 – Funzione con valori di tabella a più istruzioni

Ecco come scriveremmo la funzione se volessimo che fosse una funzione con valori di tabella a più istruzioni.

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 questo caso, utilizziamo una variabile di tipo tabella chiamato @Albums e specifichiamo esplicitamente la struttura della tabella di ritorno. I risultati della query vengono archiviati in quella variabile, che viene quindi restituita quando viene richiamata la funzione.

Uno dei vantaggi degli MSTVF è che possono contenere più istruzioni. Eccolo di nuovo con una parte extra aggiunta alla fine.

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

Vedere Creazione di una funzione con valori di tabella a più istruzioni per esempi di aggiunta di opzioni come l'associazione di schemi e la crittografia.