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.