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

2 modi per elencare tutte le funzioni con valori di tabella in un database di SQL Server

Questo articolo presenta due modi per restituire un elenco di funzioni con valori di tabella 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 con valori di tabella in un database.

Questa visualizzazione restituisce una riga per ogni stored procedure e funzione a cui l'utente corrente può accedere nel database corrente. Ciò potrebbe includere routine che non sono funzioni con valori di tabella, quindi dovrai aggiungere un WHERE clausola per restringerla alle sole funzioni con valori di tabella.

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

Risultato:

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

In questo caso, Music il database contiene tre funzioni con valori di tabella.

Il ROUTINE_TYPE la colonna restituisce PROCEDURA se è una procedura memorizzata e FUNCTION se è una funzione Il DATA_TYPE la colonna restituisce TABELLA solo se è una funzione con valori di tabella. Pertanto, avrei potuto omettere il ROUTINE_TYPE colonna dal WHERE clausola, ma l'ho inclusa comunque.

Restituisci la definizione della funzione

Questa vista ha anche un ROUTINE_DEFINITION colonna che contiene la definizione. Ecco un esempio di modifica della query precedente per restituire la definizione per una sola routine:

SELECT TOP(1) ROUTINE_DEFINITION
FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_TYPE = 'FUNCTION'
AND DATA_TYPE = 'TABLE';

Risultato:

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

In questo caso ho usato TOP() clausola per limitare i risultati a una sola riga, ma potresti facilmente elencare la definizione di tutte le funzioni rimuovendo il TOP() clausola.

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

Un altro modo per restituire un elenco di funzioni con valori di tabella consiste nell'interrogare sys.objects vista catalogo di sistema.

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

Risultato:

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

Restituisci la definizione della funzione

Puoi unirti a questo con sys.sql_modules visualizza se desideri che la definizione venga restituita.

Esempio:

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

Risultato:

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

Ancora una volta, questo usa TOP() clausola per limitare i risultati a una sola riga.