Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

2 начина за изброяване на всички функции с таблично значение в база данни на SQL Server

Тази статия представя два начина за връщане на списък с функции с таблична стойност в база данни на SQL Server.

Опция 1 – Изгледът на информационната схема на ROUTINES

Можете да използвате ROUTINES изглед на информационна схема, за да получите списък с всички функции с таблична стойност в база данни.

Този изглед връща един ред за всяка съхранена процедура и функция, които могат да бъдат достъпни от текущия потребител в текущата база данни. Това може да включва подпрограми, които не са функции с таблица, така че ще трябва да добавите WHERE клауза, за да я стесните само до функции с таблица.

USE Music;
SELECT 
  ROUTINE_SCHEMA,
  ROUTINE_NAME,
  ROUTINE_TYPE,
  DATA_TYPE
FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_TYPE = 'FUNCTION'
AND DATA_TYPE = 'TABLE';

Резултат:

+------------------+-------------------------+----------------+-------------+
| ROUTINE_SCHEMA   | ROUTINE_NAME            | ROUTINE_TYPE   | DATA_TYPE   |
|------------------+-------------------------+----------------+-------------|
| dbo              | ufn_AlbumsByGenre       | FUNCTION       | TABLE       |
| dbo              | ufn_AlbumsByArtist      | FUNCTION       | TABLE       |
| dbo              | ufn_AlbumsByGenre_MSTVF | FUNCTION       | TABLE       |
+------------------+-------------------------+----------------+-------------+

В този случай Музика база данни съдържа три функции с таблична стойност.

ROUTINE_TYPE колоната връща PROCEDURE ако това е съхранена процедура и FUNCTION ако е функция. DATA_TYPE колоната връща TABLE само ако е функция с таблично значение. Следователно бих могъл да пропусна ROUTINE_TYPE колона от WHERE клауза, но все пак я включих.

Върнете дефиницията на функцията

Този изглед също има ROUTINE_DEFINITION колона, която съдържа определението. Ето пример за модифициране на горната заявка, за да върне дефиницията само за една рутина:

SELECT TOP(1) ROUTINE_DEFINITION
FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_TYPE = 'FUNCTION'
AND DATA_TYPE = 'TABLE';

Резултат:

+----------------------+
| 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
);                      |
+----------------------+

В този случай използвах TOP() клауза за ограничаване на резултатите само до един ред, но можете лесно да изброите дефиницията на всички функции, като премахнете TOP() клауза.

Опция 2 – Изгледът на системния каталог sys.objects

Друг начин за връщане на списък с функции с таблична стойност е да се потърси sys.objects изглед на системния каталог.

SELECT 
  SCHEMA_NAME(schema_id) AS [Schema],
  name,
  type_desc
FROM sys.objects
WHERE type IN ('IF', 'TF', 'FT');

Резултат:

+----------+-------------------------+----------------------------------+
| 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        |
+----------+-------------------------+----------------------------------+

Върнете дефиницията на функцията

Можете да се присъедините към това с sys.sql_modules преглед, ако искате дефиницията да бъде върната.

Пример:

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');

Резултат:

+--------------+
| 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
);              |
+--------------+

Отново, това използва TOP() клауза за ограничаване на резултатите само до един ред.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ATAN() Примери в SQL Server

  2. Изявление ExecuteNonQuery за SELECT sql, което не връща редове

  3. Как да премахнете базата данни с помощта на TSQL и GUI - SQL Server / TSQL Урок, част 25

  4. Отстраняване на проблеми с производителността на процесора на SQL Server

  5. Намиране на родител от най-високо ниво в SQL