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.