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.