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.