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.