Dieser Artikel stellt zwei Möglichkeiten zum Zurückgeben einer Liste von Tabellenwertfunktionen in einer SQL Server-Datenbank vor.
Option 1 – Die ROUTINES-Informationsschemaansicht
Sie können die ROUTINES
verwenden Informationsschemaansicht, um eine Liste aller Tabellenwertfunktionen in einer Datenbank zu erhalten.
Diese Ansicht gibt eine Zeile für jede gespeicherte Prozedur und Funktion zurück, auf die der aktuelle Benutzer in der aktuellen Datenbank zugreifen kann. Dies könnte Routinen umfassen, die keine Tabellenwertfunktionen sind, daher müssen Sie ein WHERE
hinzufügen -Klausel, um sie auf Tabellenwertfunktionen einzugrenzen.
USE Music; SELECT ROUTINE_SCHEMA, ROUTINE_NAME, ROUTINE_TYPE, DATA_TYPE FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_TYPE = 'FUNCTION' AND DATA_TYPE = 'TABLE';
Ergebnis:
+------------------+-------------------------+----------------+-------------+ | ROUTINE_SCHEMA | ROUTINE_NAME | ROUTINE_TYPE | DATA_TYPE | |------------------+-------------------------+----------------+-------------| | dbo | ufn_AlbumsByGenre | FUNCTION | TABLE | | dbo | ufn_AlbumsByArtist | FUNCTION | TABLE | | dbo | ufn_AlbumsByGenre_MSTVF | FUNCTION | TABLE | +------------------+-------------------------+----------------+-------------+
In diesem Fall die Musik Die Datenbank enthält drei Tabellenwertfunktionen.
Der ROUTINE_TYPE
Spalte gibt
PROCEDURE
zurück wenn es sich um eine gespeicherte Prozedur handelt und
FUNCTION
wenn es eine Funktion ist. Der DATA_TYPE
Spalte gibt
TABLE
zurück nur wenn es sich um eine Tabellenfunktion handelt. Daher hätte ich den ROUTINE_TYPE
weglassen können Spalte aus WHERE
Klausel, aber ich habe sie trotzdem eingefügt.
Gib die Definition der Funktion zurück
Diese Ansicht hat auch eine ROUTINE_DEFINITION
Spalte, die die Definition enthält. Hier ist ein Beispiel für die Änderung der obigen Abfrage, um die Definition für nur eine Routine zurückzugeben:
SELECT TOP(1) ROUTINE_DEFINITION FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_TYPE = 'FUNCTION' AND DATA_TYPE = 'TABLE';
Ergebnis:
+----------------------+ | ROUTINE_DEFINITION | |----------------------| | CREATE FUNCTION [dbo].[ufn_AlbumsByGenre](@GenreId int) RETURNS TABLE AS RETURN( SELECT ar.ArtistName, al.AlbumName, g.Genre FROM Genres g INNER JOIN Albums al ON g.GenreId = al.GenreId INNER JOIN Artists ar ON al.ArtistId = ar.ArtistId WHERE g.GenreId = @GenreId ); | +----------------------+
In diesem Fall habe ich den TOP()
verwendet -Klausel, um die Ergebnisse auf nur eine Zeile zu beschränken, aber Sie könnten die Definition aller Funktionen einfach auflisten, indem Sie TOP()
entfernen Klausel.
Option 2 – Die sys.objects-Systemkatalogansicht
Eine andere Möglichkeit, eine Liste von Tabellenwertfunktionen zurückzugeben, besteht darin, sys.objects
abzufragen Systemkatalogansicht.
SELECT SCHEMA_NAME(schema_id) AS [Schema], name, type_desc FROM sys.objects WHERE type IN ('IF', 'TF', 'FT');
Ergebnis:
+----------+-------------------------+----------------------------------+ | Schema | name | type_desc | |----------+-------------------------+----------------------------------| | dbo | ufn_AlbumsByGenre | SQL_INLINE_TABLE_VALUED_FUNCTION | | dbo | ufn_AlbumsByArtist | SQL_INLINE_TABLE_VALUED_FUNCTION | | dbo | ufn_AlbumsByGenre_MSTVF | SQL_TABLE_VALUED_FUNCTION | +----------+-------------------------+----------------------------------+
Gib die Definition der Funktion zurück
Sie können dies mit den sys.sql_modules
verbinden anzeigen, wenn Sie möchten, dass die Definition zurückgegeben wird.
Beispiel:
SELECT TOP(1) definition FROM sys.objects o INNER JOIN sys.sql_modules m ON o.object_id = m.object_id WHERE type IN ('IF', 'TF', 'FT');
Ergebnis:
+--------------+ | definition | |--------------| | CREATE FUNCTION [dbo].[ufn_AlbumsByGenre](@GenreId int) RETURNS TABLE AS RETURN( SELECT ar.ArtistName, al.AlbumName, g.Genre FROM Genres g INNER JOIN Albums al ON g.GenreId = al.GenreId INNER JOIN Artists ar ON al.ArtistId = ar.ArtistId WHERE g.GenreId = @GenreId ); | +--------------+
Auch hier wird der TOP()
verwendet -Klausel, um die Ergebnisse auf nur eine Zeile zu beschränken.