Tento článek představuje dva způsoby, jak vrátit seznam funkcí s hodnotou tabulky v databázi SQL Server.
Možnost 1 – Zobrazení informačního schématu ROUTINES
Můžete použít ROUTINES
zobrazení informačního schématu, abyste získali seznam všech funkcí s hodnotou tabulky v databázi.
Toto zobrazení vrátí jeden řádek pro každou uloženou proceduru a funkci, ke které má aktuální uživatel v aktuální databázi přístup. To může zahrnovat rutiny, které nejsou funkcemi s tabulkovou hodnotou, takže budete muset přidat WHERE
klauzule, abyste ji zúžili pouze na funkce s tabulkovou hodnotou.
USE Music; SELECT ROUTINE_SCHEMA, ROUTINE_NAME, ROUTINE_TYPE, DATA_TYPE FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_TYPE = 'FUNCTION' AND DATA_TYPE = 'TABLE';
Výsledek:
+------------------+-------------------------+----------------+-------------+ | ROUTINE_SCHEMA | ROUTINE_NAME | ROUTINE_TYPE | DATA_TYPE | |------------------+-------------------------+----------------+-------------| | dbo | ufn_AlbumsByGenre | FUNCTION | TABLE | | dbo | ufn_AlbumsByArtist | FUNCTION | TABLE | | dbo | ufn_AlbumsByGenre_MSTVF | FUNCTION | TABLE | +------------------+-------------------------+----------------+-------------+
V tomto případě Hudba databáze obsahuje tři funkce s tabulkovou hodnotou.
ROUTINE_TYPE
sloupec vrátí
PROCEDURE
pokud je to uložená procedura a
FUNKCE
pokud je to funkce. DATA_TYPE
sloupec vrátí
TABLE
pouze pokud se jedná o tabulkovou funkci. Proto jsem mohl vynechat ROUTINE_TYPE
ze sloupce WHERE
klauzuli, ale přesto jsem ji zahrnul.
Vrátí definici funkce
Toto zobrazení má také ROUTINE_DEFINITION
sloupec, který obsahuje definici. Zde je příklad úpravy výše uvedeného dotazu tak, aby vrátil definici pouze pro jednu rutinu:
SELECT TOP(1) ROUTINE_DEFINITION FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_TYPE = 'FUNCTION' AND DATA_TYPE = 'TABLE';
Výsledek:
+----------------------+ | 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 ); | +----------------------+
V tomto případě jsem použil TOP()
klauzule omezující výsledky pouze na jeden řádek, ale definice všech funkcí můžete snadno uvést odstraněním TOP()
doložka.
Možnost 2 – Zobrazení systémového katalogu sys.objects
Dalším způsobem, jak vrátit seznam funkcí s tabulkovou hodnotou, je dotaz na sys.objects
zobrazení systémového katalogu.
SELECT SCHEMA_NAME(schema_id) AS [Schema], name, type_desc FROM sys.objects WHERE type IN ('IF', 'TF', 'FT');
Výsledek:
+----------+-------------------------+----------------------------------+ | 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 | +----------+-------------------------+----------------------------------+
Vrátí definici funkce
Můžete se k tomu připojit pomocí sys.sql_modules
zobrazit, pokud chcete, aby byla vrácena definice.
Příklad:
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');
Výsledek:
+--------------+ | 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 ); | +--------------+
Opět se zde používá TOP()
klauzule k omezení výsledků pouze na jeden řádek.