Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

2 Cara Mendaftar Semua Fungsi Bernilai Tabel di Database SQL Server

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. cara terbaik untuk mengonversi dan memvalidasi string tanggal

  2. Apa cara terbaik untuk menyimpan koordinat (bujur/lintang, dari Google Maps) di SQL Server?

  3. Bagaimana Anda menentukan nomor port yang berbeda di SQL Management Studio?

  4. Permintaan gagal dengan status HTTP 401:Tidak Sah DI SSRS

  5. Bagaimana cara melewatkan variabel nol ke Prosedur Tersimpan SQL dari kode C#.net