sql >> Base de Datos >  >> RDS >> Sqlserver

2 formas de enumerar todas las funciones con valores de tabla en una base de datos de SQL Server

Este artículo presenta dos formas de devolver una lista de funciones con valores de tabla en una base de datos de SQL Server.

Opción 1:la vista de esquema de información de RUTINAS

Puedes usar las ROUTINES vista de esquema de información para obtener una lista de todas las funciones con valores de tabla en una base de datos.

Esta vista devuelve una fila para cada procedimiento almacenado y función a la que puede acceder el usuario actual en la base de datos actual. Esto podría incluir rutinas que no son funciones con valores de tabla, por lo que deberá agregar un WHERE cláusula para reducirlo a solo funciones con valores de tabla.

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       |
+------------------+-------------------------+----------------+-------------+

En este caso, la Música La base de datos contiene tres funciones con valores de tabla.

El ROUTINE_TYPE columna devuelve PROCEDIMIENTO si es un procedimiento almacenado y FUNCTION si es una función. El DATA_TYPE columna devuelve TABLE solo si es una función con valores de tabla. Por lo tanto, podría haber omitido ROUTINE_TYPE columna de WHERE cláusula, pero la incluí de todos modos.

Devolver la definición de la función

Esta vista también tiene una ROUTINE_DEFINITION columna que contiene la definición. Aquí hay un ejemplo de cómo modificar la consulta anterior para devolver la definición de una sola rutina:

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
);                      |
+----------------------+

En este caso utilicé el TOP() cláusula para limitar los resultados a una sola fila, pero podría enumerar fácilmente la definición de todas las funciones eliminando TOP() cláusula.

Opción 2:la vista del catálogo del sistema sys.objects

Otra forma de devolver una lista de funciones con valores de tabla es consultar el sys.objects vista del catálogo del 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        |
+----------+-------------------------+----------------------------------+

Devolver la definición de la función

Puede unirse a esto con sys.sql_modules ver si desea que se devuelva la definición.

Ejemplo:

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
);              |
+--------------+

Nuevamente, esto usa el TOP() cláusula para limitar los resultados a una sola fila.