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.