Cet article présente deux façons de renvoyer une liste de fonctions table dans une base de données SQL Server.
Option 1 - La vue du schéma d'informations ROUTINES
Vous pouvez utiliser les ROUTINES
vue schéma d'informations pour obtenir une liste de toutes les fonctions table dans une base de données.
Cette vue renvoie une ligne pour chaque procédure stockée et fonction accessible par l'utilisateur actuel dans la base de données actuelle. Cela peut inclure des routines qui ne sont pas des fonctions table, vous devrez donc ajouter un WHERE
clause pour la réduire aux seules fonctions table.
USE Music; SELECT ROUTINE_SCHEMA, ROUTINE_NAME, ROUTINE_TYPE, DATA_TYPE FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_TYPE = 'FUNCTION' AND DATA_TYPE = 'TABLE';
Résultat :
+------------------+-------------------------+----------------+-------------+ | ROUTINE_SCHEMA | ROUTINE_NAME | ROUTINE_TYPE | DATA_TYPE | |------------------+-------------------------+----------------+-------------| | dbo | ufn_AlbumsByGenre | FUNCTION | TABLE | | dbo | ufn_AlbumsByArtist | FUNCTION | TABLE | | dbo | ufn_AlbumsByGenre_MSTVF | FUNCTION | TABLE | +------------------+-------------------------+----------------+-------------+
Dans ce cas, la Musique la base de données contient trois fonctions table.
Le ROUTINE_TYPE
la colonne renvoie
PROCEDURE
si c'est une procédure stockée et
FUNCTION
si c'est une fonction. Le DATA_TYPE
la colonne renvoie
TABLE
uniquement s'il s'agit d'une fonction table. Par conséquent, j'aurais pu omettre le ROUTINE_TYPE
colonne de WHERE
clause, mais je l'ai quand même incluse.
Renvoyer la définition de la fonction
Cette vue a également un ROUTINE_DEFINITION
colonne qui contient la définition. Voici un exemple de modification de la requête ci-dessus pour renvoyer la définition d'une seule routine :
SELECT TOP(1) ROUTINE_DEFINITION FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_TYPE = 'FUNCTION' AND DATA_TYPE = 'TABLE';
Résultat :
+----------------------+ | ROUTINE_DEFINITION | |----------------------| | CREATE FUNCTION [dbo].[ufn_AlbumsByGenre](@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 ); | +----------------------+
Dans ce cas, j'ai utilisé le TOP()
clause pour limiter les résultats à une seule ligne, mais vous pouvez facilement lister la définition de toutes les fonctions en supprimant le TOP()
clause.
Option 2 - La vue du catalogue système sys.objects
Une autre façon de renvoyer une liste de fonctions table consiste à interroger le sys.objects
vue du catalogue système.
SELECT SCHEMA_NAME(schema_id) AS [Schema], name, type_desc FROM sys.objects WHERE type IN ('IF', 'TF', 'FT');
Résultat :
+----------+-------------------------+----------------------------------+ | Schema | name | type_desc | |----------+-------------------------+----------------------------------| | dbo | ufn_AlbumsByGenre | SQL_INLINE_TABLE_VALUED_FUNCTION | | dbo | ufn_AlbumsByArtist | SQL_INLINE_TABLE_VALUED_FUNCTION | | dbo | ufn_AlbumsByGenre_MSTVF | SQL_TABLE_VALUED_FUNCTION | +----------+-------------------------+----------------------------------+
Renvoyer la définition de la fonction
Vous pouvez le joindre avec le sys.sql_modules
voir si vous voulez que la définition soit renvoyée.
Exemple :
SELECT TOP(1) definition FROM sys.objects o INNER JOIN sys.sql_modules m ON o.object_id = m.object_id WHERE type IN ('IF', 'TF', 'FT');
Résultat :
+--------------+ | definition | |--------------| | CREATE FUNCTION [dbo].[ufn_AlbumsByGenre](@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 ); | +--------------+
Encore une fois, cela utilise le TOP()
clause pour limiter les résultats à une seule ligne.