wake-up-neo.com

SQL Server - wo ist "sys.functions"?

SQL Server 2005 bietet großartige sys.XXX-Ansichten im Systemkatalog, die ich häufig verwende.

Was mich stolpert, ist Folgendes: Warum gibt es eine "sys.procedures" -Ansicht, um Informationen zu Ihren gespeicherten Prozeduren anzuzeigen, aber es gibt keine "sys.functions" -Ansicht, um dasselbe für Ihre gespeicherten Funktionen zu sehen?

Verwendet niemand gespeicherte Funktionen? Ich finde sie sehr praktisch für z. berechnete Spalten und so!

Gibt es einen bestimmten Grund, warum sys.functions fehlt, oder ist dies nur etwas, das nicht als wichtig genug angesehen wurde, um in die sys-Katalogsichten aufgenommen zu werden? Ist es in SQL Server 2008 verfügbar?

Prost, Marc

96
marc_s

Ich finde UDFs sehr praktisch und benutze sie ständig.

Ich bin mir nicht sicher, was die Gründe von Microsoft sind, wenn in SQL Server 2005 (oder SQL Server 2008, soweit ich das beurteilen kann) kein Äquivalent für sys.functions enthalten ist.

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

Eine andere Möglichkeit, Funktionen aufzulisten, ist die Verwendung von INFORMATION_SCHEMA-Ansichten.

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

Laut der Microsoft-Website "Informationsschemaansichten bieten eine interne, systemtabellenunabhängige Ansicht der SQL Server-Metadaten. Informationsschemaansichten ermöglichen das korrekte Funktionieren von Anwendungen, obwohl an den zugrunde liegenden Systemtabellen erhebliche Änderungen vorgenommen wurden". Mit anderen Worten, die zugrunde liegenden Systemtabellen können sich ändern, wenn SQL aktualisiert wird. Die Ansichten sollten jedoch gleich bleiben.

36
Tim C

Dies gilt in 2008 R2 für das, was SSMS generiert, wenn Sie ein DROP einer Funktion erstellen:

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

Es ist etwas etwas ausführlicher, aber dies sollte genau das gleiche tun:

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

Soweit ich sehen kann, ist es auch nicht in SQL Server 2008.

5
Ayresome

Dies fügt nichts Neues hinzu, aber ich erinnere mich an Folgendes:

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

versuche dies :

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

möchten Sie übrigens type = 'FS' einschließen?

name    type    type_desc
getNewsletterStats  FS  CLR_SCALAR_FUNCTION

das ist das Element in sys.objects für meine UDF, die von einer externen DLL abgeleitet wird

2
kramaswamy

Um die Antwort von @ LukeH zu erweitern, müssen auch die Funktionsdefinitionen zurückgegeben werden, wenn ein Join zur sys.sql_modules-Tabelle erforderlich ist. Die Frage dazu lautet also:

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

wo oben der Funktionsname, seine Definition und die Objektkennung angezeigt werden.

2
MoonKnight

Für eine ausführlichere Beschreibung der Skalarfunktionen einschließlich Eigentümer und Rückgabetyp:

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 spezifisch, leichte Anpassung für den Objektnamen:

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

OR

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