W tym artykule przedstawiono dwa sposoby zwracania listy funkcji wycenianych w tabeli w bazie danych SQL Server.
Opcja 1 – Widok schematu informacyjnego ROUTINES
Możesz użyć ROUTINES widok schematu informacji, aby uzyskać listę wszystkich funkcji z wartościami przechowywanymi w tabeli w bazie danych.
Ten widok zwraca jeden wiersz dla każdej procedury składowanej i funkcji, do których bieżący użytkownik może uzyskać dostęp w bieżącej bazie danych. Może to obejmować procedury, które nie są funkcjami wycenianymi w tabeli, więc musisz dodać WHERE klauzula, aby zawęzić ją do funkcji wycenianych w tabeli.
USE Music; SELECT ROUTINE_SCHEMA, ROUTINE_NAME, ROUTINE_TYPE, DATA_TYPE FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_TYPE = 'FUNCTION' AND DATA_TYPE = 'TABLE';
Wynik:
+------------------+-------------------------+----------------+-------------+ | ROUTINE_SCHEMA | ROUTINE_NAME | ROUTINE_TYPE | DATA_TYPE | |------------------+-------------------------+----------------+-------------| | dbo | ufn_AlbumsByGenre | FUNCTION | TABLE | | dbo | ufn_AlbumsByArtist | FUNCTION | TABLE | | dbo | ufn_AlbumsByGenre_MSTVF | FUNCTION | TABLE | +------------------+-------------------------+----------------+-------------+
W tym przypadku Muzyka baza danych zawiera trzy funkcje o wartościach tabelarycznych.
ROUTINE_TYPE kolumna zwraca
PROCEDURA
jeśli jest to procedura składowana i
FUNKCJA
jeśli jest to funkcja. DATA_TYPE kolumna zwraca
TABELA
tylko wtedy, gdy jest to funkcja wyceniana w tabeli. Dlatego mogłem pominąć ROUTINE_TYPE kolumna z WHERE klauzula, ale i tak ją uwzględniłem.
Zwróć definicję funkcji
Ten widok ma również ROUTINE_DEFINITION kolumna zawierająca definicję. Oto przykład modyfikacji powyższego zapytania w celu zwrócenia definicji tylko jednej procedury:
SELECT TOP(1) ROUTINE_DEFINITION FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_TYPE = 'FUNCTION' AND DATA_TYPE = 'TABLE';
Wynik:
+----------------------+
| 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
); |
+----------------------+
W tym przypadku użyłem TOP() klauzula ograniczająca wyniki tylko do jednego wiersza, ale możesz łatwo wyświetlić definicję wszystkich funkcji, usuwając TOP() klauzula.
Opcja 2 – Widok katalogu systemu sys.objects
Innym sposobem na zwrócenie listy funkcji z wartościami przechowywanymi w tabeli jest zapytanie o sys.objects widok katalogu systemowego.
SELECT
SCHEMA_NAME(schema_id) AS [Schema],
name,
type_desc
FROM sys.objects
WHERE type IN ('IF', 'TF', 'FT');
Wynik:
+----------+-------------------------+----------------------------------+ | 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 | +----------+-------------------------+----------------------------------+
Zwróć definicję funkcji
Możesz dołączyć do tego za pomocą sys.sql_modules zobacz, czy chcesz, aby definicja została zwrócona.
Przykład:
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');
Wynik:
+--------------+
| 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
); |
+--------------+
Ponownie, używa to TOP() klauzula ograniczająca wyniki tylko do jednego wiersza.