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.