sql >> Database >  >> RDS >> Sqlserver

2 manieren om alle tabelwaardige functies in een SQL Server-database op te sommen

In dit artikel worden twee manieren beschreven om een ​​lijst met functies met tabelwaarde in een SQL Server-database te retourneren.

Optie 1 – De ROUTINES-informatieschemaweergave

U kunt de ROUTINES . gebruiken informatieschemaweergave om een ​​lijst te krijgen van alle functies met tabelwaarde in een database.

Deze weergave retourneert één rij voor elke opgeslagen procedure en functie die toegankelijk is voor de huidige gebruiker in de huidige database. Dit kunnen routines zijn die geen functie met tabelwaarde zijn, dus u moet een WHERE toevoegen clausule om het te beperken tot alleen functies met tabelwaarde.

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

Resultaat:

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

In dit geval is de Muziek database bevat drie functies met tabelwaarde.

De ROUTINE_TYPE kolom retourneert PROCEDURE als het een opgeslagen procedure is en FUNCTIE als het een functie is. De DATA_TYPE kolom retourneert TABEL alleen als het een functie met tabelwaarde is. Daarom had ik de ROUTINE_TYPE . kunnen weglaten kolom uit de WHERE clausule, maar ik heb het toch opgenomen.

Retourneer de definitie van de functie

Deze weergave heeft ook een ROUTINE_DEFINITION kolom die de definitie bevat. Hier is een voorbeeld van het wijzigen van de bovenstaande query om de definitie voor slechts één routine te retourneren:

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

Resultaat:

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

In dit geval gebruikte ik de TOP() clausule om de resultaten te beperken tot slechts één rij, maar u kunt eenvoudig de definitie van alle functies opsommen door de TOP() te verwijderen clausule.

Optie 2 – De systeemcatalogusweergave sys.objects

Een andere manier om een ​​lijst met functies met tabelwaarde te retourneren, is door de sys.objects . op te vragen systeemcatalogusweergave.

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

Resultaat:

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

Retourneer de definitie van de functie

U kunt hieraan deelnemen met de sys.sql_modules bekijken als u wilt dat de definitie wordt geretourneerd.

Voorbeeld:

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

Resultaat:

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

Nogmaals, dit gebruikt de TOP() clausule om de resultaten te beperken tot slechts één rij.


  1. Python MySQL-connector - ongelezen resultaat gevonden bij gebruik van fetchone

  2. Android - Gebruikersnaam weergeven uit sqlite-database na inloggen in textView

  3. Oracle:is er een tool om queries te traceren, zoals Profiler voor SQL Server?

  4. slaapstand met c3p0:createClob() is nog niet geïmplementeerd