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.