Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

2 sposoby na wyświetlenie listy wszystkich funkcji wartościujących tabelę w bazie danych SQL Server

W tym artykule przedstawiono dwa sposoby zwracania listy funkcji wycenianych w tabeli w bazie danych SQL Server.

Opcja 1 – Widok schematu informacyjnego ROUTINES

Możesz użyć ROUTINES widok schematu informacji, aby uzyskać listę wszystkich funkcji z wartościami przechowywanymi w tabeli w bazie danych.

Ten widok zwraca jeden wiersz dla każdej procedury składowanej i funkcji, do których bieżący użytkownik może uzyskać dostęp w bieżącej bazie danych. Może to obejmować procedury, które nie są funkcjami wycenianymi w tabeli, więc musisz dodać WHERE klauzula, aby zawęzić ją do funkcji wycenianych w tabeli.

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

Wynik:

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

W tym przypadku Muzyka baza danych zawiera trzy funkcje o wartościach tabelarycznych.

ROUTINE_TYPE kolumna zwraca PROCEDURA jeśli jest to procedura składowana i FUNKCJA jeśli jest to funkcja. DATA_TYPE kolumna zwraca TABELA tylko wtedy, gdy jest to funkcja wyceniana w tabeli. Dlatego mogłem pominąć ROUTINE_TYPE kolumna z WHERE klauzula, ale i tak ją uwzględniłem.

Zwróć definicję funkcji

Ten widok ma również ROUTINE_DEFINITION kolumna zawierająca definicję. Oto przykład modyfikacji powyższego zapytania w celu zwrócenia definicji tylko jednej procedury:

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

Wynik:

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

W tym przypadku użyłem TOP() klauzula ograniczająca wyniki tylko do jednego wiersza, ale możesz łatwo wyświetlić definicję wszystkich funkcji, usuwając TOP() klauzula.

Opcja 2 – Widok katalogu systemu sys.objects

Innym sposobem na zwrócenie listy funkcji z wartościami przechowywanymi w tabeli jest zapytanie o sys.objects widok katalogu systemowego.

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

Wynik:

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

Zwróć definicję funkcji

Możesz dołączyć do tego za pomocą sys.sql_modules zobacz, czy chcesz, aby definicja została zwrócona.

Przykład:

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

Wynik:

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

Ponownie, używa to TOP() klauzula ograniczająca wyniki tylko do jednego wiersza.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak dodać lub upuścić kolumnę z tabeli włączonej usługi CDC bez utraty danych w bazie danych programu SQL Server — samouczek programu SQL Server

  2. Zwróć listę zdarzeń wyzwalania serwera w SQL Server

  3. Co jest szybsze COALESCE CZY ISNULL?

  4. Jak dodać ograniczenie klucza podstawowego do kolumn tożsamości do wszystkich tabel w bazie danych programu SQL Server — samouczek programu SQL Server / TSQL, część 63

  5. Klient SQL dla Mac OS X, który współpracuje z MS SQL Server