sql >> Database teknologi >  >> RDS >> Sqlserver

2 måder at liste alle tabelværdierede funktioner i en SQL Server-database

Denne artikel præsenterer to måder at returnere en liste over tabelværdierede funktioner i en SQL Server-database.

Mulighed 1 – RUTINER-informationsskemavisningen

Du kan bruge ROUTINES informationsskemavisning for at få en liste over alle tabelværdierede funktioner i en database.

Denne visning returnerer én række for hver lagret procedure og funktion, som den aktuelle bruger kan få adgang til i den aktuelle database. Dette kan omfatte rutiner, der ikke er tabelværdierede funktioner, så du bliver nødt til at tilføje en WHERE klausul for at indsnævre det til kun tabelværdierede funktioner.

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

Resultat:

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

I dette tilfælde er Musik databasen indeholder tre tabel-værdierede funktioner.

ROUTINE_TYPE kolonne returnerer PROCEDURE hvis det er en lagret procedure og FUNKTION hvis det er en funktion. DATA_TYPE kolonne returnerer TABEL kun hvis det er en funktion med tabelværdi. Derfor kunne jeg have udeladt ROUTINE_TYPE kolonne fra WHERE klausul, men jeg inkluderede den alligevel.

Returnér funktionens definition

Denne visning har også en ROUTINE_DEFINITION kolonne, der indeholder definitionen. Her er et eksempel på ændring af ovenstående forespørgsel for at returnere definitionen for kun én rutine:

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

Resultat:

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

I dette tilfælde brugte jeg TOP() klausul for at begrænse resultaterne til kun én række, men du kan nemt liste definitionen af ​​alle funktioner ved at fjerne TOP() klausul.

Mulighed 2 – Sys.objects systemkatalogvisning

En anden måde at returnere en liste over funktioner med tabelværdi på er at forespørge sys.objects systemkatalogvisning.

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

Resultat:

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

Returnér funktionens definition

Du kan tilslutte dette med sys.sql_modules se, hvis du ønsker, at definitionen skal returneres.

Eksempel:

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

Resultat:

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

Igen bruger dette TOP() klausul for at begrænse resultaterne til kun én række.


  1. Sådan fungerer funktionen WEIGHT_STRING() i MySQL

  2. Java:Indsæt flere rækker i MySQL med PreparedStatement

  3. Sådan bruges SQLite Dump-kommandoen

  4. Tuning Input/Output (I/O) operationer for PostgreSQL