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.