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.