SQL Server - gdzie jest „sys.functions”?

104

SQL Server 2005 ma świetne widoki sys.XXX w katalogu systemowym, z którego często korzystam.

To, co mnie potyka, to: dlaczego istnieje widok „sys.procedures”, aby wyświetlić informacje o procedurach składowanych, ale nie ma widoku „sys.functions”, aby zobaczyć to samo dla funkcji składowanych?

Czy nikt nie używa zapisanych funkcji? Uważam je za bardzo przydatne np. W przypadku kolumn obliczonych i tym podobnych!

Czy istnieje konkretny powód braku sys.functions, czy jest to po prostu coś, co nie zostało uznane za wystarczająco ważne, aby umieścić je w widokach katalogu sys? Czy jest dostępny w SQL Server 2008?

Pozdrawiam, Marc

marc_s
źródło
Odpowiedź udzielona przez TimC (odpowiedziała 22 stycznia o 14:06) jest preferowana w stosunku do starszej tabeli systemowej sysobjects, ponieważ masz kolumnę LAST_ALTERED w INFORMATION_SCHEMA.ROUTINES, która jest podobna do kolumny modified_date, która istnieje w sys.tables, sys.views, sys.procedures, itp. Jeśli jednak używasz bardziej zaktualizowanego widoku systemowego sys.objects, masz modyfikację_date, tak jak w tych tabelach. Moje 0,02 $. Pozdrawiam,
-Matthew
1
@JuniorMayhe: ok - oto sugestia Connect , którą wpisałem - zagłosuj za nią! :-)
marc_s
1
Myślę, że @marc_s ma dobry punkt: wiele osób nie może zrozumieć, dlaczego nie ma sys.functions. Masz sys.foreign_keysi nie sys.primary_keys. W każdym razie, proszę was o skorzystanie z otwartego kanału Microsoftu, aby zaproponować i zasugerować nowe funkcje dla przyszłych wersji SQL Server na connect.microsoft.com/SQLServer/Feedback. Dodałem już opinię dotyczącą sys.functions na connect.microsoft.com/ SQLServer / feedback / details / 1127920
Junior

Odpowiedzi:

117

Uważam, że UDF są bardzo przydatne i używam ich cały czas.

Nie jestem pewien, jakie są powody, dla których Microsoft nie zawiera odpowiednika sys.functions w SQL Server 2005 (lub SQL Server 2008, o ile wiem), ale łatwo jest wprowadzić własne:

CREATE VIEW my_sys_functions_equivalent
AS
SELECT *
FROM sys.objects
WHERE type IN ('FN', 'IF', 'TF')  -- scalar, inline table-valued, table-valued
LukeH
źródło
7
Powinno to również obejmować typy funkcji CLR: „AF”, „FS” i „FT”. Zobacz opis kolumny sys.objects „typ” tutaj: msdn.microsoft.com/en-us/library/ms190324.aspx
Triynko,
4
„AF” nie jest uważane za „funkcję” w kategoriach metadanych obiektu SQL Server, mimo że oznacza AGGREGATE_FUNCTION. Jest bardziej oczywiste, że Agregat jest typem obiektu innym niż inne funkcje zdefiniowane przez użytkownika, jeśli weźmie się pod uwagę, że tworzy się nowy agregat za pomocą CREATE AGGREGATE zamiast CREATE FUNCTION. Typy obiektów „FN”, „IF”, „TF”, „FS” i „FT” to pięć typów funkcji, na podstawie których SSMS (przez SMO) generuje skrypt, gdy kod funkcji IF EXISTS… DROP.
Orlando Colamatteo,
37

Innym sposobem tworzenia listy funkcji jest użycie widoków INFORMATION_SCHEMA.

SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_TYPE = 'FUNCTION'

Według witryny internetowej firmy Microsoft „Widoki schematów informacji zapewniają wewnętrzny, niezależny od tabel systemowych widok metadanych programu SQL Server. Widoki schematów informacji umożliwiają poprawną pracę aplikacji, mimo że w podstawowych tabelach systemowych wprowadzono istotne zmiany”. Innymi słowy, podstawowe tabele systemowe mogą ulec zmianie, gdy SQL zostanie zaktualizowany, ale widoki powinny pozostać takie same.

Tim C.
źródło
Tak, dzięki, znam również INFORMATION_SCHEMA - ale jako długoletni użytkownik sys.xxxx nadal przychodzi łatwiej - dzięki za przypomnienie!
marc_s
4
INFORMACJA_SCHEMA byłaby świetna, ale nie obejmuje całego zestawu większych procedur - co sprawia, że ​​jest mniej niż bezwartościowa, jeśli szukasz w ciele. To nie to, czego nie wiesz,
wpędzi
3
Widoki Information_Schema są wyraźnie udokumentowane jako niewiarygodne w niektórych przypadkach. np. „Nie używaj widoków INFORMATION_SCHEMA do określenia schematu obiektu. Jedynym niezawodnym sposobem znalezienia schematu obiektu jest wysłanie zapytania do widoku katalogu sys.objects” z msdn.microsoft.com/en-us/library/ ms188757.aspx
David Eison
Podoba mi się ta odpowiedź, ponieważ INFORMATION_SCHEMAzapytanie zwraca bardzo ciekawe wyniki, takie jak IS_DETERMINISTIC(które chciałem się dowiedzieć).
Tomasz Gandor
18

Jest to ważne w 2008 R2 według tego, co SSMS generuje podczas skryptu DROP funkcji:

SELECT  *
FROM    sys.objects
WHERE   type IN (N'FN', N'IF', N'TF', N'FS', N'FT') ;

/*
From http://msdn.microsoft.com/en-us/library/ms177596.aspx:
 FN SQL_SCALAR_FUNCTION
 FS Assembly (CLR) scalar-function
 FT Assembly (CLR) table-valued function
 IF SQL_INLINE_TABLE_VALUED_FUNCTION
 TF SQL_TABLE_VALUED_FUNCTION
*/
Orlando Colamatteo
źródło
1
Twoja sugestia zmiany powinna być komentarzem, a nie zmianą. „Funkcja AF Aggregate” jest wyraźnie z dokumentacji MS (sprawdź link), więc ten post wygląda na całkowicie poprawny. Jeśli się nie zgadzasz: skomentuj . Nie edytuj. Jeśli ludzie wielokrotnie odrzucali twoją zmianę, powinno to być wskazówką, że być może robisz coś złego, a nie inni ludzie.
Martin Tournoij
@Carpetsmoker „AF” nie jest uważany za „funkcję” w kategoriach metadanych obiektu SQL Server, mimo że oznacza AGGREGATE_FUNCTION. Jest bardziej oczywiste, że Agregat jest typem obiektu innym niż inne funkcje zdefiniowane przez użytkownika, jeśli weźmie się pod uwagę, że tworzy się nowy agregat za pomocą CREATE AGGREGATE zamiast CREATE FUNCTION. Typy obiektów „FN”, „IF”, „TF”, „FS” i „FT” to pięć typów funkcji, na podstawie których SSMS (przez SMO) generuje skrypt, gdy kod funkcji IF EXISTS… DROP. Powinieneś zaakceptować moją edycję, aby cofnąć nieprawidłowe dodanie AF do listy typów funkcji SQL Server.
Orlando Colamatteo
5

Jest nieco bardziej szczegółowy, ale powinno to zrobić dokładnie to samo:

select * from sys.objects where (type='TF' or type='FN')

O ile widzę, nie ma go również w SQL Server 2008.

Ayresome
źródło
1
Tak, właśnie to zrobiłem sam, aby stworzyć widok "sys_functions" :-) Zastanawiam się tylko, dlaczego nie ma go w produkcie po wyjęciu z pudełka ...
marc_s
4

Nie dodaje to niczego nowego, ale łatwiej zapamiętać:

select * from sys.objects where type_desc like '%fun%'
yoniLavi
źródło
Jeśli kod pocztowy, próbki XML lub danych, należy zaznaczyć te linie w edytorze tekstowym i kliknij na przycisk „Kod próbki” ( { }) na pasku narzędzi edytora, aby ładnie format i składnia go podświetlić!
marc_s
Dzięki, ale staram się unikać „mieć wszystko” sys.objectstak bardzo, jak tylko mogę.
marc_s
4

Spróbuj tego :

SELECT * FROM sys.objects
where type_desc = 'SQL_SCALAR_FUNCTION'
vishal kadam
źródło
2

nawiasem mówiąc, czy nie chciałbyś dołączyć type = 'FS'?

name    type    type_desc
getNewsletterStats  FS  CLR_SCALAR_FUNCTION

temu odpowiada element w sys.objects dla mojego UDF, który pochodzi z zewnętrznej biblioteki DLL


źródło
2

Aby rozszerzyć odpowiedź @ LukeH, zwrócenie definicji funkcji również wymaga sprzężenia z sys.sql_modulestabelą. Zatem zapytanie o to brzmi:

SELECT O.name as 'Function name', M.definition as 'Definition', O.object_id
FROM sys.objects as O INNER JOIN sys.sql_modules as M
    ON O.object_id = M.object_id
WHERE type IN ('FN', 'IF', 'TF')  -- scalar, inline table-valued, table-valued

gdzie powyżej wyświetla odpowiednio nazwę funkcji, jej definicję i identyfikator obiektu.

Księżycowy rycerz
źródło
2

Aby uzyskać pełniejszy opis funkcji skalarnych, w tym właściciela i zwracanego typu:

SELECT f.name, s.name AS owner, t.name as dataType, p.max_length, p.precision, p.scale, m.definition
FROM sys.objects f
JOIN sys.schemas s on s.schema_id = f.schema_id
JOIN sys.parameters p on p.object_id = f.object_id AND p.parameter_id = 0
JOIN sys.types t ON t.system_type_id = p.system_type_id 
JOIN sys.sql_modules as m ON m.object_id = f.object_id
WHERE type='FN';
Peter Brand
źródło
0

SQL 2000 specyficzna, niewielka korekta nazwy obiektu:

SELECT *
FROM sysobjects
WHERE type IN ('FN', 'IF', 'TF')

LUB

SELECT *
FROM dbo.sysobjects
WHERE type IN ('FN', 'IF', 'TF')
Goran B.
źródło