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.