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

2 formas de devolver todas las funciones definidas por el usuario en una base de datos de SQL Server

Este artículo presenta dos formas de devolver una lista de funciones definidas por el usuario 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 definidas por el usuario en una base de datos.

Esta vista devuelve procedimientos almacenados y funciones, por lo que deberá agregar un WHERE cláusula para reducirla a solo funciones.

USE Music;
SELECT 
  ROUTINE_SCHEMA,
  ROUTINE_NAME,
  ROUTINE_TYPE,
  DATA_TYPE
FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_TYPE = 'FUNCTION';

Resultado:

+------------------+-------------------------+----------------+-------------+
| ROUTINE_SCHEMA   | ROUTINE_NAME            | ROUTINE_TYPE   | DATA_TYPE   |
|------------------+-------------------------+----------------+-------------|
| dbo              | ISOweek                 | FUNCTION       | int         |
| dbo              | ufn_AlbumsByGenre       | FUNCTION       | TABLE       |
| dbo              | ufn_AlbumsByArtist      | FUNCTION       | TABLE       |
| dbo              | ufn_AlbumsByGenre_MSTVF | FUNCTION       | TABLE       |
+------------------+-------------------------+----------------+-------------+

Devolver la definición de la función

Esta vista también tiene una ROUTINE_DEFINITION columna, por lo que puede devolver fácilmente la definición de cada función si es necesario.

SELECT ROUTINE_DEFINITION
FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_TYPE = 'FUNCTION';

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

Otra forma de devolver una lista de funciones 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 ('AF','FN','FS','FT','IF','TF');

Resultado:

+----------+-------------------------+----------------------------------+
| Schema   | name                    | type_desc                        |
|----------+-------------------------+----------------------------------|
| dbo      | ISOweek                 | SQL_SCALAR_FUNCTION              |
| dbo      | ufn_AlbumsByGenre       | SQL_INLINE_TABLE_VALUED_FUNCTION |
| dbo      | ufn_AlbumsByArtist      | SQL_INLINE_TABLE_VALUED_FUNCTION |
| dbo      | ufn_AlbumsByGenre_MSTVF | SQL_TABLE_VALUED_FUNCTION        |
+----------+-------------------------+----------------------------------+

Aquí he incluido explícitamente todos los tipos de funciones en WHERE cláusula.

Si está ejecutando una consulta ad hoc pero no puede recordar todos los tipos, podría hacer algo como esto:

SELECT 
  SCHEMA_NAME(schema_id) AS [Schema],
  name,
  type_desc
FROM sys.objects
WHERE type_desc LIKE '%FUNCTION';

O esto:

SELECT 
  SCHEMA_NAME(schema_id) AS [Schema],
  name,
  type_desc
FROM sys.objects
WHERE RIGHT(type_desc, 8) = 'FUNCTION';

Devolver la definición de la función

Los sys.objects view no incluye una columna para la definición del objeto. Si desea devolver la definición de cada función, puede unirla con sys.sql_modules vista del sistema.

Ejemplo:

SELECT definition
FROM sys.objects o
INNER JOIN sys.sql_modules m 
ON o.object_id = m.object_id
WHERE type IN ('AF','FN','FS','FT','IF','TF');