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

2 façons de renvoyer toutes les fonctions définies par l'utilisateur dans une base de données SQL Server

Cet article présente deux façons de renvoyer une liste de fonctions définies par l'utilisateur 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'information pour obtenir une liste de toutes les fonctions définies par l'utilisateur dans une base de données.

Cette vue renvoie les procédures stockées ainsi que les fonctions, vous devrez donc ajouter un WHERE clause pour la réduire aux seules fonctions.

USE Music;
SELECT 
  ROUTINE_SCHEMA,
  ROUTINE_NAME,
  ROUTINE_TYPE,
  DATA_TYPE
FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_TYPE = 'FUNCTION';

Résultat :

+------------------+-------------------------+----------------+-------------+
| ROUTINE_SCHEMA   | ROUTINE_NAME            | ROUTINE_TYPE   | DATA_TYPE   |
|------------------+-------------------------+----------------+-------------|
| dbo              | ISOweek                 | FUNCTION       | int         |
| dbo              | ufn_AlbumsByGenre       | FUNCTION       | TABLE       |
| dbo              | ufn_AlbumsByArtist      | FUNCTION       | TABLE       |
| dbo              | ufn_AlbumsByGenre_MSTVF | FUNCTION       | TABLE       |
+------------------+-------------------------+----------------+-------------+

Renvoyer la définition de la fonction

Cette vue a également un ROUTINE_DEFINITION colonne, afin que vous puissiez facilement renvoyer la définition de chaque fonction si nécessaire.

SELECT ROUTINE_DEFINITION
FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_TYPE = 'FUNCTION';

Option 2 - La vue du catalogue système sys.objects

Une autre façon de retourner une liste de fonctions est d'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 ('AF','FN','FS','FT','IF','TF');

Résultat :

+----------+-------------------------+----------------------------------+
| Schema   | name                    | type_desc                        |
|----------+-------------------------+----------------------------------|
| dbo      | ISOweek                 | SQL_SCALAR_FUNCTION              |
| dbo      | ufn_AlbumsByGenre       | SQL_INLINE_TABLE_VALUED_FUNCTION |
| dbo      | ufn_AlbumsByArtist      | SQL_INLINE_TABLE_VALUED_FUNCTION |
| dbo      | ufn_AlbumsByGenre_MSTVF | SQL_TABLE_VALUED_FUNCTION        |
+----------+-------------------------+----------------------------------+

Ici, j'ai explicitement inclus tous les types de fonctions dans le WHERE clause.

Si vous exécutez une requête ad hoc mais que vous ne vous souvenez pas de tous les types, vous pouvez faire quelque chose comme ceci :

SELECT 
  SCHEMA_NAME(schema_id) AS [Schema],
  name,
  type_desc
FROM sys.objects
WHERE type_desc LIKE '%FUNCTION';

Ou ceci :

SELECT 
  SCHEMA_NAME(schema_id) AS [Schema],
  name,
  type_desc
FROM sys.objects
WHERE RIGHT(type_desc, 8) = 'FUNCTION';

Renvoyer la définition de la fonction

Les sys.objects La vue n'inclut pas de colonne pour la définition de l'objet. Si vous souhaitez renvoyer la définition de chaque fonction, vous pouvez la joindre avec le sys.sql_modules vue système.

Exemple :

SELECT definition
FROM sys.objects o
INNER JOIN sys.sql_modules m 
ON o.object_id = m.object_id
WHERE type IN ('AF','FN','FS','FT','IF','TF');