Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

2 maneiras de listar todas as funções com valor de tabela em um banco de dados SQL Server


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.