È 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.