Тази статия представя два начина за връщане на списък с функции с таблична стойност в база данни на 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() клауза за ограничаване на резултатите само до един ред.