Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

2 modi per restituire tutte le funzioni definite dall'utente in un database di SQL Server

Questo articolo presenta due modi per restituire un elenco di funzioni definite dall'utente in un database di SQL Server.

Opzione 1 – Visualizzazione dello schema delle informazioni ROUTINE

Puoi usare le ROUTINES vista schema di informazioni per ottenere un elenco di tutte le funzioni definite dall'utente in un database.

Questa vista restituisce stored procedure e funzioni, quindi dovrai aggiungere un WHERE clausola per restringerla alle sole funzioni.

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

Risultato:

+------------------+-------------------------+----------------+-------------+
| 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       |
+------------------+-------------------------+----------------+-------------+

Restituisci la definizione della funzione

Questa vista ha anche un ROUTINE_DEFINITION colonna, in modo da poter restituire facilmente la definizione di ciascuna funzione, se necessario.

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

Opzione 2 – La vista del catalogo di sistema sys.objects

Un altro modo per restituire un elenco di funzioni è interrogare sys.objects vista catalogo di sistema.

SELECT 
  SCHEMA_NAME(schema_id) AS [Schema],
  name,
  type_desc
FROM sys.objects
WHERE type IN ('AF','FN','FS','FT','IF','TF');

Risultato:

+----------+-------------------------+----------------------------------+
| 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        |
+----------+-------------------------+----------------------------------+

Qui ho incluso esplicitamente tutti i tipi di funzione in WHERE clausola.

Se stai eseguendo una query ad hoc ma non ricordi tutti i tipi, puoi fare qualcosa del genere:

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

O questo:

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

Restituisci la definizione della funzione

Il sys.objects view non include una colonna per la definizione dell'oggetto. Se vuoi restituire la definizione di ciascuna funzione, puoi unirla con sys.sql_modules vista di sistema.

Esempio:

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');