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.