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
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
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.
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
*/
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.
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%'
essaye ça :
SELECT * FROM sys.objects
where type_desc = 'SQL_SCALAR_FUNCTION'
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
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.
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';
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')