sql >> Databáze >  >> RDS >> Sqlserver

2 způsoby, jak vypsat všechny funkce s hodnotou tabulky v databázi SQL Server

Tento článek představuje dva způsoby, jak vrátit seznam funkcí s hodnotou tabulky v databázi SQL Server.

Možnost 1 – Zobrazení informačního schématu ROUTINES

Můžete použít ROUTINES zobrazení informačního schématu, abyste získali seznam všech funkcí s hodnotou tabulky v databázi.

Toto zobrazení vrátí jeden řádek pro každou uloženou proceduru a funkci, ke které má aktuální uživatel v aktuální databázi přístup. To může zahrnovat rutiny, které nejsou funkcemi s tabulkovou hodnotou, takže budete muset přidat WHERE klauzule, abyste ji zúžili pouze na funkce s tabulkovou hodnotou.

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

Výsledek:

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

V tomto případě Hudba databáze obsahuje tři funkce s tabulkovou hodnotou.

ROUTINE_TYPE sloupec vrátí PROCEDURE pokud je to uložená procedura a FUNKCE pokud je to funkce. DATA_TYPE sloupec vrátí TABLE pouze pokud se jedná o tabulkovou funkci. Proto jsem mohl vynechat ROUTINE_TYPE ze sloupce WHERE klauzuli, ale přesto jsem ji zahrnul.

Vrátí definici funkce

Toto zobrazení má také ROUTINE_DEFINITION sloupec, který obsahuje definici. Zde je příklad úpravy výše uvedeného dotazu tak, aby vrátil definici pouze pro jednu rutinu:

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

Výsledek:

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

V tomto případě jsem použil TOP() klauzule omezující výsledky pouze na jeden řádek, ale definice všech funkcí můžete snadno uvést odstraněním TOP() doložka.

Možnost 2 – Zobrazení systémového katalogu sys.objects

Dalším způsobem, jak vrátit seznam funkcí s tabulkovou hodnotou, je dotaz na sys.objects zobrazení systémového katalogu.

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

Výsledek:

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

Vrátí definici funkce

Můžete se k tomu připojit pomocí sys.sql_modules zobrazit, pokud chcete, aby byla vrácena definice.

Příklad:

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

Výsledek:

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

Opět se zde používá TOP() klauzule k omezení výsledků pouze na jeden řádek.


  1. 3 způsoby, jak získat název měsíce z data v SQL Server (T-SQL)

  2. WITH CHECK ADD CONSTRAINT následované CHECK CONSTRAINT vs. ADD CONSTRAINT

  3. Notace UML

  4. vytváření parametrizovaných pohledů v oracle11g