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.