Artikel ini menyajikan dua cara untuk mengembalikan daftar fungsi bernilai tabel di database SQL Server.
Opsi 1 – Tampilan Skema Informasi RUTIN
Anda dapat menggunakan ROUTINES
tampilan skema informasi untuk mendapatkan daftar semua fungsi bernilai tabel dalam database.
Tampilan ini mengembalikan satu baris untuk setiap prosedur dan fungsi tersimpan yang dapat diakses oleh pengguna saat ini dalam database saat ini. Ini dapat mencakup rutinitas yang bukan fungsi bernilai tabel, jadi Anda harus menambahkan WHERE
klausa untuk mempersempitnya menjadi hanya fungsi bernilai tabel.
USE Music; SELECT ROUTINE_SCHEMA, ROUTINE_NAME, ROUTINE_TYPE, DATA_TYPE FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_TYPE = 'FUNCTION' AND DATA_TYPE = 'TABLE';
Hasil:
+------------------+-------------------------+----------------+-------------+ | ROUTINE_SCHEMA | ROUTINE_NAME | ROUTINE_TYPE | DATA_TYPE | |------------------+-------------------------+----------------+-------------| | dbo | ufn_AlbumsByGenre | FUNCTION | TABLE | | dbo | ufn_AlbumsByArtist | FUNCTION | TABLE | | dbo | ufn_AlbumsByGenre_MSTVF | FUNCTION | TABLE | +------------------+-------------------------+----------------+-------------+
Dalam hal ini, Musik database berisi tiga fungsi bernilai tabel.
ROUTINE_TYPE
kolom mengembalikan
PROCEDURE
jika itu adalah prosedur tersimpan dan
FUNCTION
jika itu adalah fungsi. DATA_TYPE
kolom mengembalikan
TABLE
hanya jika itu adalah fungsi bernilai tabel. Oleh karena itu, saya dapat menghilangkan ROUTINE_TYPE
kolom dari WHERE
klausa, tapi saya tetap memasukkannya.
Kembalikan Definisi Fungsi
Tampilan ini juga memiliki ROUTINE_DEFINITION
kolom yang berisi definisi. Berikut adalah contoh memodifikasi kueri di atas untuk mengembalikan definisi hanya untuk satu rutin:
SELECT TOP(1) ROUTINE_DEFINITION FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_TYPE = 'FUNCTION' AND DATA_TYPE = 'TABLE';
Hasil:
+----------------------+ | 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 ); | +----------------------+
Dalam hal ini saya menggunakan TOP()
klausa untuk membatasi hasil hanya satu baris, tetapi Anda dapat dengan mudah membuat daftar definisi semua fungsi dengan menghapus TOP()
klausa.
Opsi 2 – Tampilan Katalog Sistem sys.objects
Cara lain untuk mengembalikan daftar fungsi bernilai tabel adalah dengan menanyakan sys.objects
tampilan katalog sistem.
SELECT SCHEMA_NAME(schema_id) AS [Schema], name, type_desc FROM sys.objects WHERE type IN ('IF', 'TF', 'FT');
Hasil:
+----------+-------------------------+----------------------------------+ | 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 | +----------+-------------------------+----------------------------------+
Kembalikan Definisi Fungsi
Anda dapat bergabung dengan ini dengan sys.sql_modules
lihat jika Anda ingin definisi dikembalikan.
Contoh:
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');
Hasil:
+--------------+ | 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 ); | +--------------+
Sekali lagi, ini menggunakan TOP()
klausa untuk membatasi hasil hanya satu baris.