Question

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

Ce qui me fait trébucher, c’est ceci: pourquoi y a-t-il un "sys.procedures"? affichez des informations sur vos procédures stockées, mais il n'y a pas de "sys.functions". voir pour voir la même chose pour vos fonctions stockées?

Quelqu'un n'utilise-t-il pas les 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 de catalogue sys? Est-il disponible dans SQL Server 2008?

Salut, Marc

Était-ce utile?

La solution

Je trouve les formats 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

Autres conseils

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’information fournissent une vue interne, indépendante de la table système, des métadonnées SQL Server. Les vues de schéma d’information 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 à mesure de la mise à niveau de SQL, mais les vues doivent rester les mêmes.

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.

Ceci 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%'

essayez ceci:

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

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

name    type    type_desc
getNewsletterStats  FS  CLR_SCALAR_FUNCTION

Voilà à quoi correspond l'élément dans sys.objects pour mon fichier UDF dérivé d'une DLL externe

Pour étendre 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 cela 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 propriétaire et le type 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';

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

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

OU

SELECT *
FROM dbo.sysobjects
WHERE type IN ('FN', 'IF', 'TF')
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top