Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

2 cách liệt kê tất cả các hàm có giá trị bảng trong cơ sở dữ liệu SQL Server

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL hàng đến cột

  2. Sử dụng Excel VBA để chạy truy vấn SQL

  3. Nhận giá trị trả lại từ JDBC MSSQL

  4. Làm cách nào để thêm thuộc tính nhận dạng vào cột hiện có trong SQL Server

  5. Nhận ngày giữa một loạt các ngày