2009-01-22 16 views
92

SQL Server 2005 tiene excelentes vistas de sys.XXX en el catálogo del sistema que utilizo con frecuencia.SQL Server - ¿dónde está "sys.functions"?

Lo que me sorprende es esto: ¿por qué hay una vista "sys.procedures" para ver información sobre sus procedimientos almacenados, pero no hay una vista "sys.functions" para ver lo mismo para sus funciones almacenadas?

¿Alguien usa las funciones almacenadas? Los encuentro muy útiles, por ej. columnas calculadas y tal!

¿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 colocarlo en las vistas del catálogo del sistema? ¿Está disponible en SQL Server 2008?

Saludos, Marc

+0

La respuesta proporcionada por TimC (respondida el 22 de enero a las 14:06) es preferible a usar la tabla del sistema sysobjects anterior, porque tiene una columna LAST_ALTERED en INFORMATION_SCHEMA.ROUTINES que es similar a la columna modify_date que existe en sys.tables, sys.views, sys.procedures, etc. Sin embargo, si está utilizando la vista más actualizada del sistema sys.objects, tiene modify_date como en esas tablas. Mi $ 0.02. Cheers, -Matthew – Maashu

+1

@JuniorMayhe: ok, aquí está el [Sugerencias para la sugerencia de Connect] (https://connect.microsoft.com/SQLServer/feedback/details/1127918) que ingresé, ¡lo voy a subir! :-) –

+1

Creo que @marc_s tiene un buen punto: mucha gente no puede entender por qué no hay 'sys.functions'. Tienes 'sys.foreign_keys' y no' sys.primary_keys'. De todos modos, les pido que utilicen el canal abierto de Microsoft para proponer y sugerir nuevas características para las próximas versiones de SQL Server en https://connect.microsoft.com/SQLServer/Feedback. Ya he agregado un comentario sobre las funciones sys en https: //connect.microsoft.com/SQLServer/feedback/details/1127920 –

Respuesta

102

Encuentro que las UDF son muy útiles y las uso todo el tiempo.

no estoy seguro de qué justificación de Microsoft es para no incluir un sys.functions equivalentes en SQL Server 2005 (o SQL Server 2008, por lo que yo puedo decir), pero es bastante fácil de rodar su propia:

CREATE VIEW my_sys_functions_equivalent 
AS 
SELECT * 
FROM sys.objects 
WHERE type IN ('FN', 'IF', 'TF') -- scalar, inline table-valued, table-valued 
+6

Esto también debería incluir los tipos de función CLR: 'AF', 'FS' y 'FT'. Consulte la descripción de columna de "tipo" de sys.objects aquí: http://msdn.microsoft.com/en-us/library/ms190324.aspx – Triynko

+3

"AF" no se considera una "función" en términos de metadatos de objetos de SQL Server aunque representa AGGREGATE_FUNCTION. Es más claro que un Agregado es un tipo de objeto diferente de otras funciones definidas por el usuario cuando se considera que se crea un nuevo agregado mediante CREAR AGREGADO en lugar de CREAR FUNCIÓN. Los tipos de objetos 'FN', 'IF', 'TF', 'FS' y 'FT' son los cinco tipos de funciones por lo que SSMS (a través de SMO) genera al crear scripts SI EXISTE ... DROP FUNCTION code. –

6

Es muy poco más detallado, pero esto debe hacer exactamente lo mismo:

select * from sys.objects where (type='TF' or type='FN') 

Por lo que yo puedo ver, no es de SQL Server 2008 tampoco.

+1

Sí, eso es lo que básicamente hice para crear una vista de "sys_functions" :-) Me preguntaba por qué no está en el producto de fábrica ... –

+1

Te perdiste 'IF' –

+0

... y 'FS' y 'FT'. –

35

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 "vistas de esquema de información proporcionan una vista interna, sistema de mesas-independiente de la de SQL Server metadatos. Vistas de esquema de información permiten que las aplicaciones funcionen correctamente aunque se han hecho cambios significativos en el sistema subyacente mesas". En otras palabras, las tablas del sistema subyacentes pueden cambiar a medida que SQL se actualiza, pero las vistas deben seguir siendo las mismas.

+0

Sí, gracias, también conozco INFORMATION_SCHEMA, pero como usuario de mucho tiempo, sys.xxxx aún es más fácil, gracias por el recordatorio. –

+4

INFORMATION_SCHEMA sería genial, pero no incluye todo el cuerpo de procedimientos más grandes, lo que lo hace menos útil si realiza una búsqueda en el cuerpo. No es lo que no sabe que lo meterá en problemas, pero lo que usted sabe es que no ... – jmoreno

+3

Information_Schema views están expresamente documentadas como no confiables para algunas cosas. p.ej. "No use las vistas INFORMATION_SCHEMA para determinar el esquema de un objeto. La única forma confiable de encontrar el esquema de un objeto es consultar la vista del catálogo sys.objects" desde http://msdn.microsoft.com/en-us /library/ms188757.aspx –

2

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

name type type_desc 
getNewsletterStats FS CLR_SCALAR_FUNCTION 

eso es lo que el artículo en sys.objects corresponde con mi UDF que se deriva de una DLL externa

17

Esto es válido en 2008 R2 por lo que genera SSMS cuando la escritura de una gota 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 
*/ 
+1

Su sugerencia de edición debe ser un comentario, no una edición. la "función de agregación de AF" es claramente de la documentación de MS (verifique el enlace), por lo que esta publicación parece completamente correcta. Si no está de acuerdo: ** comentario **. Ha notado. Si las personas rechazan repetidamente su edición, esto debería ser una pista de que * usted * quizás esté haciendo algo mal y * no * las otras personas. – Carpetsmoker

+0

@Carpetsmoker "AF" no se considera una "función" en términos de los metadatos de objetos de SQL Server, a pesar de que representa AGGREGATE_FUNCTION. Es más claro que un Agregado es un tipo de objeto diferente de otras funciones definidas por el usuario cuando se considera que se crea un nuevo agregado mediante CREAR AGREGADO en lugar de CREAR FUNCIÓN.Los tipos de objetos 'FN', 'IF', 'TF', 'FS' y 'FT' son los cinco tipos de funciones por lo que SSMS (a través de SMO) genera al crear scripts SI EXISTE ... DROP FUNCTION code. Debería aceptar mi edición para revertir la adición incorrecta de AF a la lista de tipos de funciones de SQL Server. –

5

Esto no añade nada nuevo, pero me encontré con el siguiente más fácil de recordar:

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

Si publica código, XML o muestras de datos, ** por favor ** resalte esas líneas en el editor de texto y haga clic en el botón "muestras de código" ('{}') en la barra de herramientas del editor para formatear y sintaxis ¡destaquelo! –

+0

Gracias, pero trato de evitar el "tenerlo todo" 'sys.objects' tanto como puedo. –

2

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. Por lo que la consulta de 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 las pantallas encima del nombre de la función, su definición y el identificador de objeto, respectivamente.

4

probar esto:

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

Para una descripción más completa de las funciones escalares, incluyendo propietario y volver tipo:

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

SQL 2000 específica, ligero ajuste del nombre de objeto:

SELECT * 
FROM sysobjects 
WHERE type IN ('FN', 'IF', 'TF') 

O

SELECT * 
FROM dbo.sysobjects 
WHERE type IN ('FN', 'IF', 'TF') 
Cuestiones relacionadas