Bài viết này trình bày hai cách để trả về danh sách các hàm có giá trị bảng trong cơ sở dữ liệu SQL Server.
Tùy chọn 1 - Chế độ xem giản đồ thông tin ROUTINES
Bạn có thể sử dụng ROUTINES
chế độ xem lược đồ thông tin để nhận danh sách tất cả các hàm có giá trị bảng trong cơ sở dữ liệu.
Dạng xem này trả về một hàng cho mỗi thủ tục và chức năng được lưu trữ mà người dùng hiện tại có thể truy cập trong cơ sở dữ liệu hiện tại. Điều này có thể bao gồm các quy trình không phải là hàm giá trị của bảng, vì vậy bạn sẽ cần thêm WHERE
để thu hẹp nó xuống chỉ các hàm có giá trị bảng.
USE Music; SELECT ROUTINE_SCHEMA, ROUTINE_NAME, ROUTINE_TYPE, DATA_TYPE FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_TYPE = 'FUNCTION' AND DATA_TYPE = 'TABLE';
Kết quả:
+------------------+-------------------------+----------------+-------------+ | ROUTINE_SCHEMA | ROUTINE_NAME | ROUTINE_TYPE | DATA_TYPE | |------------------+-------------------------+----------------+-------------| | dbo | ufn_AlbumsByGenre | FUNCTION | TABLE | | dbo | ufn_AlbumsByArtist | FUNCTION | TABLE | | dbo | ufn_AlbumsByGenre_MSTVF | FUNCTION | TABLE | +------------------+-------------------------+----------------+-------------+
Trong trường hợp này, Âm nhạc cơ sở dữ liệu chứa ba hàm có giá trị bảng.
ROUTINE_TYPE
cột trả về
PROCEDURE
nếu đó là một thủ tục được lưu trữ và
FUNCTION
nếu đó là một chức năng. DATA_TYPE
cột trả về
TABLE
chỉ khi đó là một hàm có giá trị bảng. Do đó, tôi có thể đã bỏ qua ROUTINE_TYPE
từ WHERE
, nhưng tôi vẫn đưa nó vào.
Trả về Định nghĩa của Hàm
Chế độ xem này cũng có ROUTINE_DEFINITION
cột chứa định nghĩa. Dưới đây là một ví dụ về việc sửa đổi truy vấn ở trên để trả về định nghĩa chỉ cho một quy trình:
SELECT TOP(1) ROUTINE_DEFINITION FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_TYPE = 'FUNCTION' AND DATA_TYPE = 'TABLE';
Kết quả:
+----------------------+ | 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 ); | +----------------------+
Trong trường hợp này, tôi đã sử dụng TOP()
mệnh đề để giới hạn kết quả chỉ ở một hàng, nhưng bạn có thể dễ dàng liệt kê định nghĩa của tất cả các hàm bằng cách loại bỏ TOP()
mệnh đề.
Tùy chọn 2 - Chế độ xem danh mục hệ thống sys.objects
Một cách khác để trả về danh sách các hàm có giá trị bảng là truy vấn sys.objects
chế độ xem danh mục hệ thống.
SELECT SCHEMA_NAME(schema_id) AS [Schema], name, type_desc FROM sys.objects WHERE type IN ('IF', 'TF', 'FT');
Kết quả:
+----------+-------------------------+----------------------------------+ | 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 | +----------+-------------------------+----------------------------------+
Trả về Định nghĩa của Hàm
Bạn có thể tham gia điều này với sys.sql_modules
xem nếu bạn muốn định nghĩa được trả về.
Ví dụ:
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');
Kết quả:
+--------------+ | 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 ); | +--------------+
Một lần nữa, điều này sử dụng TOP()
mệnh đề giới hạn kết quả chỉ ở một hàng.