Тази статия представя два начина за връщане на списък с функции с таблична стойност в база данни на SQL Server.
Опция 1 – Изгледът на информационната схема на ROUTINES
Можете да използвате ROUTINES
изглед на информационна схема, за да получите списък с всички функции с таблична стойност в база данни.
Този изглед връща един ред за всяка съхранена процедура и функция, които могат да бъдат достъпни от текущия потребител в текущата база данни. Това може да включва подпрограми, които не са функции с таблица, така че ще трябва да добавите WHERE
клауза, за да я стесните само до функции с таблица.
USE Music; SELECT ROUTINE_SCHEMA, ROUTINE_NAME, ROUTINE_TYPE, DATA_TYPE FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_TYPE = 'FUNCTION' AND DATA_TYPE = 'TABLE';
Резултат:
+------------------+-------------------------+----------------+-------------+ | ROUTINE_SCHEMA | ROUTINE_NAME | ROUTINE_TYPE | DATA_TYPE | |------------------+-------------------------+----------------+-------------| | dbo | ufn_AlbumsByGenre | FUNCTION | TABLE | | dbo | ufn_AlbumsByArtist | FUNCTION | TABLE | | dbo | ufn_AlbumsByGenre_MSTVF | FUNCTION | TABLE | +------------------+-------------------------+----------------+-------------+
В този случай Музика база данни съдържа три функции с таблична стойност.
ROUTINE_TYPE
колоната връща
PROCEDURE
ако това е съхранена процедура и
FUNCTION
ако е функция. DATA_TYPE
колоната връща
TABLE
само ако е функция с таблично значение. Следователно бих могъл да пропусна ROUTINE_TYPE
колона от WHERE
клауза, но все пак я включих.
Върнете дефиницията на функцията
Този изглед също има ROUTINE_DEFINITION
колона, която съдържа определението. Ето пример за модифициране на горната заявка, за да върне дефиницията само за една рутина:
SELECT TOP(1) ROUTINE_DEFINITION FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_TYPE = 'FUNCTION' AND DATA_TYPE = 'TABLE';
Резултат:
+----------------------+ | 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 ); | +----------------------+
В този случай използвах TOP()
клауза за ограничаване на резултатите само до един ред, но можете лесно да изброите дефиницията на всички функции, като премахнете TOP()
клауза.
Опция 2 – Изгледът на системния каталог sys.objects
Друг начин за връщане на списък с функции с таблична стойност е да се потърси sys.objects
изглед на системния каталог.
SELECT SCHEMA_NAME(schema_id) AS [Schema], name, type_desc FROM sys.objects WHERE type IN ('IF', 'TF', 'FT');
Резултат:
+----------+-------------------------+----------------------------------+ | 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 | +----------+-------------------------+----------------------------------+
Върнете дефиницията на функцията
Можете да се присъедините към това с sys.sql_modules
преглед, ако искате дефиницията да бъде върната.
Пример:
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');
Резултат:
+--------------+ | 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 ); | +--------------+
Отново, това използва TOP()
клауза за ограничаване на резултатите само до един ред.