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.