SQL Server - wo ist "sys.functions"?


103

SQL Server 2005 bietet großartige sys.XXX-Ansichten für den 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 keine "sys.functions" -Ansicht, um dasselbe für Ihre gespeicherten Funktionen anzuzeigen?

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

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

Prost, Marc


Die Antwort von TimC (beantwortet am 22. Januar um 14:06 Uhr) wird der Verwendung der älteren Systemtabelle sysobjects vorgezogen, da Sie in INFORMATION_SCHEMA.ROUTINES eine LAST_ALTERED-Spalte haben, die der in sys.tables vorhandenen Spalte "modify_date" ähnelt. sys.views, sys.procedures usw. Wenn Sie jedoch die aktualisierte Systemansicht sys.objects verwenden, haben Sie das Änderungsdatum wie in diesen Tabellen. Meine $ 0,02. Prost, -Matthew
Maashu

1
@JuniorMayhe: ok - hier ist das Feedback zum Connect-Vorschlag , das ich eingegeben habe - stimme zu! :-)
marc_s

1
Ich denke, @marc_s hat einen guten Punkt: Viele Leute können nicht verstehen, warum es keine gibt sys.functions. Du hast sys.foreign_keysund nein sys.primary_keys. Wie auch immer, ich bitte Sie, den offenen Kanal von Microsoft zu verwenden, um neue Funktionen für kommende Versionen von SQL Server unter connect.microsoft.com/SQLServer/Feedback vorzuschlagen und vorzuschlagen. Ich habe bereits ein Feedback zu sys.functions unter connect.microsoft.com/ hinzugefügt. SQLServer / feedback / details / 1127920
Junior Mayhé

Antworten:


116

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

Ich bin mir nicht sicher, warum Microsoft in SQL Server 2005 (oder SQL Server 2008, soweit ich das beurteilen kann) kein sys.functions-Äquivalent enthält, aber es ist einfach genug, ein eigenes zu erstellen:

CREATE VIEW my_sys_functions_equivalent
AS
SELECT *
FROM sys.objects
WHERE type IN ('FN', 'IF', 'TF')  -- scalar, inline table-valued, table-valued

7
Dies sollte auch die CLR-Funktionstypen einschließen: 'AF', 'FS' und 'FT'. Siehe sys.objects "Typ" Spaltenbeschreibung hier: msdn.microsoft.com/en-us/library/ms190324.aspx
Triynko

4
"AF" wird in Bezug auf die Objektmetadaten von SQL Server nicht als "Funktion" betrachtet, obwohl es für AGGREGATE_FUNCTION steht. Es ist klarer, dass ein Aggregat ein Objekttyp ist, der sich von anderen benutzerdefinierten Funktionen unterscheidet, wenn Sie berücksichtigen, dass Sie ein neues Aggregat mit CREATE AGGREGATE anstelle von CREATE FUNCTION erstellen. Die Objekttypen 'FN', 'IF', 'TF', 'FS' und 'FT' sind die fünf Funktionstypen, die SSMS (über SMO) beim Erstellen von Skripten generiert, wenn EXISTIERT ... DROP FUNCTION-Code.
Orlando Colamatteo

37

Eine andere Möglichkeit, Funktionen aufzulisten, besteht darin, INFORMATION_SCHEMA-Ansichten zu verwenden.

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

Laut der Microsoft-Website "bieten Informationsschemaansichten eine interne, systemtabellenunabhängige Ansicht der SQL Server-Metadaten. Mit Informationsschemaansichten können Anwendungen ordnungsgemäß funktionieren, obwohl wesentliche Änderungen an den zugrunde liegenden Systemtabellen vorgenommen wurden". Mit anderen Worten, die zugrunde liegenden Systemtabellen können sich ändern, wenn SQL aktualisiert wird. Die Ansichten sollten jedoch unverändert bleiben.


Ja, danke, ich kenne auch INFORMATION_SCHEMA - aber als langjähriger Benutzer ist sys.xxxx immer noch einfacher - danke für die Erinnerung!
marc_s

4
INFORMATION_SCHEMA wäre großartig, aber es enthält nicht den gesamten Umfang größerer Prozeduren - was es weniger als wertlos macht, wenn Sie im Körper suchen. Es ist nicht das, was du nicht weißt, was dich in Schwierigkeiten bringen wird, aber was du weißt, ist nicht so ...
jmoreno

3
Information_Schema-Ansichten werden ausdrücklich als für einige Dinge nicht zuverlässig dokumentiert. Beispiel: "Verwenden Sie keine INFORMATION_SCHEMA-Ansichten, um das Schema eines Objekts zu bestimmen. Die einzige zuverlässige Möglichkeit, das Schema eines Objekts zu finden, besteht darin, die Katalogansicht sys.objects abzufragen." von msdn.microsoft.com/en-us/library/ ms188757.aspx
David Eison

Ich mag diese Antwort, weil die INFORMATION_SCHEMAAbfrage sehr interessante Ergebnisse wie IS_DETERMINISTIC(die ich herausfinden wollte) zurückgibt .
Tomasz Gandor

18

Dies gilt in 2008 R2 gemäß dem, was SSMS generiert, wenn Sie einen DROP einer Funktion skripten:

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
Ihr Bearbeitungsvorschlag sollte ein Kommentar sein, keine Bearbeitung. Die "AF-Aggregatfunktion" stammt eindeutig aus der MS-Dokumentation (siehe Link), daher sieht dieser Beitrag völlig korrekt aus. Wenn Sie nicht einverstanden sind: Kommentar . Merkte es an. Wenn Leute Ihre Bearbeitung wiederholt abgelehnt haben, sollte dies ein Hinweis darauf sein, dass Sie möglicherweise etwas falsch machen und nicht die anderen Leute.
Martin Tournoij

@Carpetsmoker "AF" wird in Bezug auf die Objektmetadaten von SQL Server nicht als "Funktion" betrachtet, obwohl es für AGGREGATE_FUNCTION steht. Es ist klarer, dass ein Aggregat ein Objekttyp ist, der sich von anderen benutzerdefinierten Funktionen unterscheidet, wenn Sie berücksichtigen, dass Sie ein neues Aggregat mit CREATE AGGREGATE anstelle von CREATE FUNCTION erstellen. Die Objekttypen 'FN', 'IF', 'TF', 'FS' und 'FT' sind die fünf Funktionstypen, die SSMS (über SMO) beim Erstellen von Skripten generiert, wenn EXISTIERT ... DROP FUNCTION-Code. Sie sollten meine Bearbeitung akzeptieren, um das falsche Hinzufügen von AF zur Liste der SQL Server-Funktionstypen zurückzusetzen.
Orlando Colamatteo

5

Es ist etwas ausführlicher, aber das 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.


1
Ja, das habe ich im Grunde genommen selbst gemacht, um eine "sys_functions" -Ansicht zu erstellen :-) Ich frage mich nur, warum es nicht
sofort

4

Dies fügt nichts Neues hinzu, aber ich fand Folgendes leichter zu merken:

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

Wenn Sie eine Postleitzahl, XML oder Datenproben, bitte diese Zeilen im Texteditor und klicken Sie auf den „Code - Beispiele“ Taste (markieren { }) auf der Editor - Symbolleiste zu schön Format und die Syntax markieren Sie es!
marc_s

Danke, aber ich versuche, das "Alles-haben" sys.objectsso weit wie möglich zu vermeiden .
marc_s

4

Versuche dies :

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

2

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

name    type    type_desc
getNewsletterStats  FS  CLR_SCALAR_FUNCTION

Das ist es, was das Element in sys.objects für meine UDF entspricht, die von einer externen DLL abgeleitet ist


2

Um die Antwort von @ LukeH zu erweitern und auch die Funktionsdefinitionen zurückzugeben, ist eine Verknüpfung mit der sys.sql_modulesTabelle erforderlich . Die Abfrage hierfür 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

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


2

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

0

SQL 2000 spezifische, leichte Anpassung für den Objektnamen:

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

ODER

SELECT *
FROM dbo.sysobjects
WHERE type IN ('FN', 'IF', 'TF')
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.