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.