web-dev-qa-db-fra.com

SQL Server - où est "sys.functions"?

SQL Server 2005 offre d'excellentes vues sys.XXX sur le catalogue système que j'utilise fréquemment.

Ce qui me tracasse est la suivante: pourquoi existe-t-il une vue "sys.procedures" pour afficher des informations sur vos procédures stockées, alors qu'il n'y a pas de vue "sys.functions" pour voir la même chose pour vos fonctions stockées?

Est-ce que personne n'utilise des fonctions stockées? Je les trouve très pratique pour par exemple colonnes calculées et autres!

Existe-t-il une raison spécifique pour l'absence de sys.functions ou s'agit-il simplement d'un problème qui n'a pas été jugé suffisamment important pour pouvoir figurer dans les vues du catalogue sys? Est-il disponible dans SQL Server 2008 ??

A bientôt, Marc

96
marc_s

Je trouve les fichiers UDF très utiles et je les utilise tout le temps.

Je ne suis pas sûr de la raison pour laquelle Microsoft n'inclut pas d'équivalent sys.functions dans SQL Server 2005 (ou SQL Server 2008, pour autant que je sache), mais il est assez facile de lancer le vôtre:

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

Une autre façon de lister les fonctions consiste à utiliser les vues INFORMATION_SCHEMA.

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

Selon le site Web de Microsoft "Les vues de schéma d'informations fournissent une vue interne, indépendante des tables système, des métadonnées SQL Server. Les vues de schéma d'informations permettent aux applications de fonctionner correctement même si des modifications importantes ont été apportées aux tables système sous-jacentes". En d'autres termes, les tables système sous-jacentes peuvent changer lors de la mise à niveau de SQL, mais les vues doivent rester identiques.

36
Tim C

Ceci est valable en 2008 R2 selon ce que SSMS génère lorsque vous écrivez un DROP d'une fonction:

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
*/
17

C'est très légèrement plus verbeux, mais cela devrait faire exactement la même chose:

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

Autant que je sache, ce n'est pas non plus dans SQL Server 2008.

5
Ayresome

Cela n’ajoute rien de nouveau, mais j’ai trouvé les éléments suivants plus faciles à retenir:

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

essaye ça :

SELECT * FROM sys.objects
where type_desc = 'SQL_SCALAR_FUNCTION'
4
vishal kadam

accessoirement, ne voudriez-vous pas inclure type = 'FS'?

name    type    type_desc
getNewsletterStats  FS  CLR_SCALAR_FUNCTION

c'est ce à quoi correspond l'élément sys.objects pour mon fichier UDF, qui est dérivé d'une DLL externe

2
kramaswamy

Pour prolonger la réponse de @ LukeH, renvoyer les définitions de fonction nécessite également une jointure à la table sys.sql_modules. Donc, la requête pour ceci est:

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

où ce qui précède affiche le nom de la fonction, sa définition et l'identifiant de l'objet, respectivement.

2
MoonKnight

Pour une description plus complète des fonctions scalaires, y compris le type de propriétaire et de retour:

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';
2
Peter Brand

SQL 2000 spécifique, léger ajustement pour le nom de l'objet:

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

OR

SELECT *
FROM dbo.sysobjects
WHERE type IN ('FN', 'IF', 'TF')
0
Goran B.