Pregunta

SQL Server 2005 tiene excelentes vistas sys.XXX en el catálogo del sistema que uso con frecuencia.

Lo que me sorprende es esto: ¿por qué hay un '' sys.procedures ''? ver para ver información sobre los procedimientos almacenados, pero no hay funciones de sys.fys ver para ver lo mismo para sus funciones almacenadas?

¿Nadie usa funciones almacenadas? Los encuentro muy útiles, p. Ej. columnas calculadas y tal!

¿Hay una razón específica por la que faltan las funciones de sys.f, o es simplemente algo que no se consideró lo suficientemente importante como para incluirlo en las vistas del catálogo de sys? ¿Está disponible en SQL Server 2008?

Saludos, Marc

¿Fue útil?

Solución

Creo que los UDF son muy útiles y los uso todo el tiempo.

No estoy seguro de cuál es la razón de ser de Microsoft para no incluir un sys.functions equivalente en SQL Server 2005 (o SQL Server 2008, por lo que puedo decir), 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

Otros consejos

Otra forma de enumerar funciones es hacer uso de las vistas INFORMATION_SCHEMA.

SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_TYPE = 'FUNCTION'

De acuerdo con el sitio web de Microsoft, las vistas de 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 se actualiza SQL, pero las vistas deben seguir siendo las mismas.

Esto es válido en 2008 R2 según lo que SSMS genera cuando ejecuta una DROP 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
*/

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 no agrega nada nuevo, pero encontré lo siguiente más fácil de recordar:

select * from sys.objects where type_desc like '%fun%'

prueba esto:

SELECT * FROM sys.objects
where type_desc = 'SQL_SCALAR_FUNCTION'

por cierto, ¿no le gustaría incluir type = 'FS'?

name    type    type_desc
getNewsletterStats  FS  CLR_SCALAR_FUNCTION

a eso corresponde el elemento en sys.objects para mi UDF que se deriva de una DLL externa

Para ampliar la respuesta de @ LukeH, para devolver las definiciones de función 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 de objeto respectivamente.

Para una descripción más completa de las funciones escalares, incluidos el propietario y el tipo de retorno:

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';

SQL 2000 específico, leve 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')
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top