sql >> Databasteknik >  >> RDS >> Sqlserver

2 sätt att lista alla tabellvärderade funktioner i en SQL Server-databas

Den här artikeln presenterar två sätt att returnera en lista med tabellvärdade funktioner i en SQL Server-databas.

Alternativ 1 – Informationsschemavyn för RUTINER

Du kan använda ROUTINES informationsschemavy för att få en lista över alla tabellvärdade funktioner i en databas.

Denna vy returnerar en rad för varje lagrad procedur och funktion som kan nås av den aktuella användaren i den aktuella databasen. Detta kan inkludera rutiner som inte är tabellvärderade funktioner, så du måste lägga till en WHERE sats för att begränsa den till bara tabellvärdade funktioner.

USE Music;
SELECT 
  ROUTINE_SCHEMA,
  ROUTINE_NAME,
  ROUTINE_TYPE,
  DATA_TYPE
FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_TYPE = 'FUNCTION'
AND DATA_TYPE = 'TABLE';

Resultat:

+------------------+-------------------------+----------------+-------------+
| ROUTINE_SCHEMA   | ROUTINE_NAME            | ROUTINE_TYPE   | DATA_TYPE   |
|------------------+-------------------------+----------------+-------------|
| dbo              | ufn_AlbumsByGenre       | FUNCTION       | TABLE       |
| dbo              | ufn_AlbumsByArtist      | FUNCTION       | TABLE       |
| dbo              | ufn_AlbumsByGenre_MSTVF | FUNCTION       | TABLE       |
+------------------+-------------------------+----------------+-------------+

I det här fallet, Musik databasen innehåller tre tabellvärdade funktioner.

ROUTINE_TYPE kolumnen returnerar PROCEDUR om det är en lagrad procedur och FUNCTION om det är en funktion. DATA_TYPE kolumnen returnerar TABELL bara om det är en tabellvärderad funktion. Därför kunde jag ha utelämnat ROUTINE_TYPE kolumnen från WHERE klausul, men jag tog med den ändå.

Återställ funktionens definition

Den här vyn har också en ROUTINE_DEFINITION kolumn som innehåller definitionen. Här är ett exempel på att ändra ovanstående fråga för att returnera definitionen för bara en rutin:

SELECT TOP(1) ROUTINE_DEFINITION
FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_TYPE = 'FUNCTION'
AND DATA_TYPE = 'TABLE';

Resultat:

+----------------------+
| 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
);                      |
+----------------------+

I det här fallet använde jag TOP() sats för att begränsa resultaten till bara en rad, men du kan enkelt lista definitionen av alla funktioner genom att ta bort TOP() klausul.

Alternativ 2 – Sys.objects systemkatalogvy

Ett annat sätt att returnera en lista med tabellvärdade funktioner är att fråga sys.objects systemkatalogvy.

SELECT 
  SCHEMA_NAME(schema_id) AS [Schema],
  name,
  type_desc
FROM sys.objects
WHERE type IN ('IF', 'TF', 'FT');

Resultat:

+----------+-------------------------+----------------------------------+
| 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        |
+----------+-------------------------+----------------------------------+

Återställ funktionens definition

Du kan ansluta till detta med sys.sql_modules visa om du vill att definitionen ska returneras.

Exempel:

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

Resultat:

+--------------+
| 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
);              |
+--------------+

Återigen, detta använder TOP() klausul för att begränsa resultaten till bara en rad.


  1. Dolda funktioner i PostgreSQL

  2. Åtgärda felet "ORA-01789:frågeblocket har felaktigt antal resultatkolumner"

  3. Hur man skickar strängarray i SQL-parameter till IN-sats i SQL

  4. Hur man skapar en vy i SQL Server