Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

2 Möglichkeiten zum Auflisten aller Tabellenwertfunktionen in einer SQL Server-Datenbank

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.