examples - sql server create function return table
SQL Server-¿dónde está "sys.functions"? (10)
SQL Server 2005 tiene excelentes vistas de sys.XXX en el catálogo del sistema que utilizo con frecuencia.
Lo que me sorprende es esto: ¿por qué hay una vista de "sys.procedures" para ver información sobre los procedimientos almacenados, pero no hay una vista de "sys.functions" para ver lo mismo para las funciones almacenadas?
¿Alguien usa las funciones almacenadas? ¡Los encuentro muy útiles para, por ejemplo, columnas calculadas y demás!
¿Hay alguna razón específica por la que falten las funciones del sistema, o es solo algo que no se consideró lo suficientemente importante como para ponerlo en las vistas del catálogo del sistema? ¿Está disponible en SQL Server 2008?
Saludos, Marc
Encuentro que las UDF son muy útiles y las uso todo el tiempo.
No estoy seguro de cuál es la lógica de Microsoft para no incluir un equivalente de sys.functions en SQL Server 2005 (o SQL Server 2008, por lo que puedo ver), pero es bastante fácil de implementar:
CREATE VIEW my_sys_functions_equivalent
AS
SELECT *
FROM sys.objects
WHERE type IN (''FN'', ''IF'', ''TF'') -- scalar, inline table-valued, table-valued
Es un poco más detallado, pero esto debería hacer exactamente lo mismo:
select * from sys.objects where (type=''TF'' or type=''FN'')
Por lo que puedo ver, tampoco está en SQL Server 2008.
Esto es válido en 2008 R2 por lo que SSMS genera cuando scripts una DETECCIÓN de una función:
SELECT *
FROM sys.objects
WHERE type IN (N''FN'', N''IF'', N''TF'', N''FS'', N''FT'') ;
/*
From http://msdn.microsoft.com/en-us/library/ms177596.aspx:
FN SQL_SCALAR_FUNCTION
FS Assembly (CLR) scalar-function
FT Assembly (CLR) table-valued function
IF SQL_INLINE_TABLE_VALUED_FUNCTION
TF SQL_TABLE_VALUED_FUNCTION
*/
Esto no agrega nada nuevo, pero encontré lo siguiente más fácil de recordar:
select * from sys.objects where type_desc like ''%fun%''
Otra forma de enumerar funciones es hacer uso de las vistas INFORMATION_SCHEMA.
SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_TYPE = ''FUNCTION''
Según el sitio web de Microsoft "Las vistas del esquema de información proporcionan una vista interna, independiente de la tabla del sistema de los metadatos de SQL Server. Las vistas de esquema de información permiten que las aplicaciones funcionen correctamente aunque se han realizado cambios significativos en las tablas del sistema subyacentes". En otras palabras, las tablas del sistema subyacentes pueden cambiar a medida que SQL se actualiza, pero las vistas deben seguir siendo las mismas.
Para ampliar la respuesta de @ LukeH, para devolver las definiciones de funciones también se requiere una unión a la tabla sys.sql_modules
. Entonces la consulta para esto es:
SELECT O.name as ''Function name'', M.definition as ''Definition'', O.object_id
FROM sys.objects as O INNER JOIN sys.sql_modules as M
ON O.object_id = M.object_id
WHERE type IN (''FN'', ''IF'', ''TF'') -- scalar, inline table-valued, table-valued
donde lo anterior muestra el nombre de la función, su definición y el identificador del objeto, respectivamente.
Para obtener una descripción más completa de las funciones escalares, incluido el propietario y el tipo de devolución:
SELECT f.name, s.name AS owner, t.name as dataType, p.max_length, p.precision, p.scale, m.definition
FROM sys.objects f
JOIN sys.schemas s on s.schema_id = f.schema_id
JOIN sys.parameters p on p.object_id = f.object_id AND p.parameter_id = 0
JOIN sys.types t ON t.system_type_id = p.system_type_id
JOIN sys.sql_modules as m ON m.object_id = f.object_id
WHERE type=''FN'';
por cierto, ¿no te gustaría incluir type = ''FS''?
name type type_desc
getNewsletterStats FS CLR_SCALAR_FUNCTION
eso es con lo que se corresponde el elemento en sys.objects para mi UDF que se deriva de una DLL externa
prueba esto :
SELECT * FROM sys.objects
where type_desc = ''SQL_SCALAR_FUNCTION''
SQL 2000
específico, ligero ajuste para el nombre del objeto:
SELECT *
FROM sysobjects
WHERE type IN (''FN'', ''IF'', ''TF'')
O
SELECT *
FROM dbo.sysobjects
WHERE type IN (''FN'', ''IF'', ''TF'')