Este artigo apresenta duas maneiras de retornar uma lista de funções com valor de tabela em um banco de dados SQL Server.
Opção 1 – A Visualização do Esquema de Informações das ROTINAS
Você pode usar as
ROUTINES
visualização do esquema de informações para obter uma lista de todas as funções com valor de tabela em um banco de dados. Essa exibição retorna uma linha para cada procedimento armazenado e função que pode ser acessada pelo usuário atual no banco de dados atual. Isso pode incluir rotinas que não são funções com valor de tabela, portanto, você precisará adicionar um
WHERE
cláusula para reduzi-lo a apenas funções com valor de tabela. USE Music; SELECT ROUTINE_SCHEMA, ROUTINE_NAME, ROUTINE_TYPE, DATA_TYPE FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_TYPE = 'FUNCTION' AND DATA_TYPE = 'TABLE';
Resultado:
+------------------+-------------------------+----------------+-------------+ | ROUTINE_SCHEMA | ROUTINE_NAME | ROUTINE_TYPE | DATA_TYPE | |------------------+-------------------------+----------------+-------------| | dbo | ufn_AlbumsByGenre | FUNCTION | TABLE | | dbo | ufn_AlbumsByArtist | FUNCTION | TABLE | | dbo | ufn_AlbumsByGenre_MSTVF | FUNCTION | TABLE | +------------------+-------------------------+----------------+-------------+
Neste caso, a Música banco de dados contém três funções com valor de tabela.
A
ROUTINE_TYPE
coluna retorna
PROCEDURE
se for um procedimento armazenado e
FUNCTION
se for uma função. O DATA_TYPE
coluna retorna
TABELA
somente se for uma função com valor de tabela. Portanto, eu poderia ter omitido o ROUTINE_TYPE
coluna de WHERE
cláusula, mas eu incluí-lo de qualquer maneira. Retorne a definição da função
Esta visualização também tem um
ROUTINE_DEFINITION
coluna que contém a definição. Aqui está um exemplo de modificação da consulta acima para retornar a definição de apenas uma rotina:SELECT TOP(1) ROUTINE_DEFINITION FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_TYPE = 'FUNCTION' AND DATA_TYPE = 'TABLE';
Resultado:
+----------------------+ | 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 ); | +----------------------+
Neste caso eu usei o
TOP()
cláusula para limitar os resultados a apenas uma linha, mas você pode listar facilmente a definição de todas as funções removendo o TOP()
cláusula. Opção 2 – A Exibição do Catálogo do Sistema sys.objects
Outra maneira de retornar uma lista de funções com valor de tabela é consultar o
sys.objects
visualização do catálogo do sistema. SELECT SCHEMA_NAME(schema_id) AS [Schema], name, type_desc FROM sys.objects WHERE type IN ('IF', 'TF', 'FT');
Resultado:
+----------+-------------------------+----------------------------------+ | 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 | +----------+-------------------------+----------------------------------+
Retorne a definição da função
Você pode juntar isso com o
sys.sql_modules
view se desejar que a definição seja retornada. Exemplo:
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');
Resultado:
+--------------+ | 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 ); | +--------------+
Novamente, isso usa o
TOP()
cláusula para limitar os resultados a apenas uma linha.