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.