117 votes

SQL Server - où se trouve "sys.functions" ?

SQL Server 2005 a une grande sys.XXX des vues sur le catalogue du système que j'utilise fréquemment.

Ce qui me turlupine, c'est ceci : pourquoi y a-t-il une sys.procedures pour voir les informations sur vos procédures stockées, mais il n'y a pas de vue sys.functions pour voir la même chose pour vos fonctions stockées ?

Personne n'utilise les fonctions stockées ? Je les trouve très pratiques, par exemple pour les colonnes calculées et autres !

Y a-t-il une raison spécifique sys.functions est manquante, ou est-ce simplement quelque chose qui n'a pas été considéré comme suffisamment important pour être mis dans les sys les vues du catalogue ? Est-il disponible dans SQL Server 2008 ?

0 votes

La réponse fournie par TimC (réponse du 22 janvier à 14:06) est préférable à l'utilisation de l'ancienne table système sysobjects, car vous disposez d'une colonne LAST_ALTERED dans INFORMATION_SCHEMA.ROUTINES qui est similaire à la colonne modify_date qui existe dans sys.tables, sys.views, sys.procedures, etc. Cependant, si vous utilisez la vue système sys.objects, plus récente, vous avez modify_date comme dans ces tables. C'est mon avis. Salutations, -Matthew

1 votes

@JuniorMayhe : ok - voilà le Connecter le feedback des suggestions que j'ai entré - allez le voter ! :-)

1 votes

Je pense que @marc_s a un bon point : beaucoup de personnes ne peuvent pas comprendre pourquoi il n'y a pas de sys.functions . Vous avez sys.foreign_keys et non sys.primary_keys . Quoi qu'il en soit, je vous demande d'utiliser le canal ouvert de Microsoft pour proposer et suggérer de nouvelles fonctionnalités pour les prochaines versions de SQL Server à l'adresse suivante connect.microsoft.com/SQLServer/Feedback J'ai déjà ajouté un commentaire concernant sys.functions à l'adresse suivante connect.microsoft.com/SQLServer/feedback/details/1127920

125voto

LukeH Points 110965

Je trouve que les UDF sont très pratiques et je les utilise tout le temps.

Je ne suis pas sûr de la raison pour laquelle Microsoft n'a pas inclus un équivalent sys.functions dans SQL Server 2005 (ou SQL Server 2008, pour autant que je sache), mais il est assez facile de créer 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

7 votes

Cela devrait également inclure les types de fonctions CLR : 'AF', 'FS' et 'FT'. Voir la description de la colonne "type" de sys.objects ici : msdn.microsoft.com/fr/us/library/ms190324.aspx

4 votes

"AF" n'est pas considéré comme une "fonction" en termes de métadonnées d'objet de SQL Server, même s'il signifie AGGREGATE_FUNCTION. Il est plus clair qu'un agrégat est un type d'objet différent des autres fonctions définies par l'utilisateur si l'on considère que vous créez un nouvel agrégat en utilisant CREATE AGGREGATE au lieu de CREATE FUNCTION. Les types d'objets 'FN', 'IF', 'TF', 'FS' et 'FT' sont les cinq types de fonctions générés par SSMS (via SMO) lors de l'écriture du code IF EXISTS...DROP FUNCTION.

38voto

Tim C Points 25946

Une autre façon de lister les fonctions est d'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 de 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 lors de la mise à niveau de SQL, mais les vues devraient rester les mêmes.

0 votes

Oui, merci, je connais aussi l'INFORMATION_SCHEMA, mais en tant qu'utilisateur de longue date, sys.xxxx est toujours plus facile à comprendre - merci pour le rappel !

4 votes

INFORMATION_SCHEMA serait parfait, mais il n'inclut pas le corps complet des procédures les plus importantes, ce qui le rend moins utile si vous cherchez dans le corps. Ce n'est pas ce que vous ne savez pas qui vous causera des ennuis, mais ce que vous savez qui n'en est pas un...

3 votes

Les vues Information_Schema sont expressément documentées comme n'étant pas fiables pour certaines choses. Par exemple, "Ne pas utiliser les vues INFORMATION_SCHEMA pour déterminer le schéma d'un objet. La seule façon fiable de trouver le schéma d'un objet est d'interroger la vue sys.objects catalog. " de msdn.microsoft.com/fr/us/library/ms188757.aspx

19voto

opc.three Points 414

Ceci est valable en 2008 R2 par ce que SSMS génère quand vous script 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
*/

1 votes

Votre suggestion d'édition devrait être un commentaire, pas une édition. La "fonction AF Aggregate" provient clairement de la documentation MS (vérifiez le lien), donc ce message semble tout à fait correct. Si vous n'êtes pas d'accord : commentaire . Ne pas éditer. Si les gens ont rejeté votre édition de manière répétée, cela devrait être un indice que vous font peut-être quelque chose de mal, et no les autres personnes.

0 votes

@Carpetsmoker "AF" n'est pas considéré comme une "fonction" en termes de métadonnées d'objet de SQL Server, même s'il signifie AGGREGATE_FUNCTION. Il est plus clair qu'un agrégat est un type d'objet différent des autres fonctions définies par l'utilisateur si l'on considère que vous créez un nouvel agrégat en utilisant CREATE AGGREGATE au lieu de CREATE FUNCTION. Les types d'objets 'FN', 'IF', 'TF', 'FS' et 'FT' sont les cinq types de fonctions générés par SSMS (via SMO) lors de l'écriture du code IF EXISTS...DROP FUNCTION. Vous devriez accepter ma modification pour revenir sur l'ajout incorrect de AF à la liste des types de fonctions SQL Server.

5voto

Ayresome Points 111

C'est un peu plus verbeux, mais cela devrait faire exactement la même chose :

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

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

1 votes

Oui, c'est ce que j'ai fait moi-même pour créer une vue "sys_functions" :-) Je me demande juste pourquoi ce n'est pas dans le produit tout de suite....

4voto

yoniLavi Points 372

Cela n'apporte rien de nouveau, mais j'ai trouvé le texte suivant plus facile à retenir :

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

0 votes

Si vous publiez des échantillons de code, de XML ou de données, s'il vous plaît mettez en évidence ces lignes dans l'éditeur de texte et cliquez sur le bouton "échantillons de code" ( { } ) dans la barre d'outils de l'éditeur pour le formater et le mettre en évidence !

0 votes

Merci, mais j'essaye d'éviter le "tout ce qu'il y a". sys.objects autant que je le peux.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X