Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

2 façons de répertorier toutes les fonctions de table dans une base de données SQL Server

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.