SQL Server - où est «sys.functions»?


104

SQL Server 2005 a de superbes vues sys.XXX sur le catalogue système que j'utilise fréquemment.

Ce qui me trébuche est ceci: pourquoi y a-t-il une vue "sys.procedures" pour voir des 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 pour laquelle sys.functions est manquant, ou est-ce juste quelque chose qui n'a pas été considéré comme suffisamment important pour être mis dans les vues du catalogue sys? Est-il disponible dans SQL Server 2008 ??

Bravo, Marc


La réponse fournie par TimC (réponse le 22 janvier à 14:06) est préférable à l'utilisation de l'ancienne table système sysobjects, car vous avez 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 mise à jour, vous avez modify_date comme dans ces tables. Mon 0,02 $. Cheers, -Matthew
Maashu

1
@JuniorMayhe: ok - voici le feedback de la suggestion Connect que j'ai entré - allez-y! :-)
marc_s

1
Je pense que @marc_s a un bon point: beaucoup de gens ne peuvent pas comprendre pourquoi il n'y en a pas sys.functions. Vous avez sys.foreign_keyset 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 versions à venir de SQL Server à connect.microsoft.com/SQLServer/Feedback J'ai déjà ajouté un commentaire concernant sys.functions à connect.microsoft.com/ SQLServer / feedback / details / 1127920
Junior Mayhé

Réponses:


117

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

Je ne suis pas sûr de la justification de Microsoft pour ne pas inclure un é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

7
Cela devrait également inclure les types de fonction CLR: «AF», «FS» et «FT». Voir la description de la colonne "type" sys.objects
Triynko

4
«AF» n'est pas considéré comme une «fonction» en termes de métadonnées d'objet de SQL Server même s'il représente 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 par ce que SSMS (via SMO) génère lors du scripting IF EXISTS ... DROP FUNCTION code.
Orlando Colamatteo

37

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 de la table système, des métadonnées SQL Server. Les vues de schéma d'informations permettent aux applications de fonctionner correctement bien que des modifications importantes aient été apportées aux tables système sous-jacentes". En d'autres termes, les tables système sous-jacentes peuvent changer à mesure que SQL est mis à niveau, mais les vues doivent rester les mêmes.


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

4
INFORMATION_SCHEMA serait génial, mais il n'inclut pas l'ensemble des procédures plus volumineuses - ce qui le rend moins que inutile si vous recherchez dans le corps. Ce n'est pas ce que vous ne savez pas qui vous
causera des

3
Les vues Information_Schema sont expressément documentées comme n'étant pas fiables pour certaines choses. Par exemple, "N'utilisez pas les vues INFORMATION_SCHEMA pour déterminer le schéma d'un objet. Le seul moyen fiable de trouver le schéma d'un objet est d'interroger la vue catalogue sys.objects." de msdn.microsoft.com/en-us/library/ ms188757.aspx
David Eison

J'aime cette réponse, car la INFORMATION_SCHEMArequête renvoie des résultats très intéressants comme IS_DETERMINISTIC(que je voulais découvrir).
Tomasz Gandor

18

Ceci est valide en 2008 R2 par rapport à ce que SSMS génère lorsque vous créez un script 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
Votre suggestion de modification doit être un commentaire et non une modification. la "fonction AF Aggregate" est clairement de la documentation MS (vérifiez le lien), donc cet article semble tout à fait correct. Si vous n'êtes pas d'accord: commentez . Pas modifier. Si des personnes ont rejeté votre modification à plusieurs reprises, cela devrait indiquer que vous faites peut-être quelque chose de mal, et non les autres personnes.
Martin Tournoij

@Carpetsmoker "AF" n'est pas considéré comme une "fonction" en termes de métadonnées d'objet de SQL Server même si cela 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 par ce que SSMS (via SMO) génère lors du scripting IF EXISTS ... DROP FUNCTION code. Vous devez accepter ma modification pour annuler l'ajout incorrect d'AF à la liste des types de fonctions SQL Server.
Orlando Colamatteo

5

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')

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


1
Oui, c'est ce que j'ai fait moi-même pour créer une vue "sys_functions" :-) Je me demande simplement pourquoi ce n'est pas dans le produit
prêt à l'emploi

4

Cela n'ajoute rien de nouveau, mais j'ai trouvé ce qui suit plus facile à retenir:

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

Si vous publiez des échantillons de code, XML ou de données, veuillez mettre en évidence ces lignes dans l'éditeur de texte et cliquer sur le bouton "exemples de code" ( { }) dans la barre d'outils de l'éditeur pour bien le formater et la mettre en évidence!
marc_s

Merci, mais j'essaie d'éviter sys.objectsautant que je peux le «avoir tout» .
marc_s

4

essaye ça :

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

2

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

name    type    type_desc
getNewsletterStats  FS  CLR_SCALAR_FUNCTION

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


2

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

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ù le ci-dessus affiche respectivement le nom de la fonction, sa définition et l'identificateur d'objet.


2

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

0

SQL 2000 spécifique, 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')
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.