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.