SQL Server - dove si trova "sys.functions"?


104

SQL Server 2005 ha ottime viste sys.XXX sul catalogo di sistema che uso frequentemente.

Quello che mi sorprende è questo: perché c'è una vista "sys.procedures" per vedere le informazioni sulle procedure memorizzate, ma non esiste una vista "sys.functions" per vedere lo stesso per le funzioni memorizzate?

Nessuno usa le funzioni memorizzate? Li trovo molto utili per es. Colonne calcolate e simili!

C'è una ragione specifica per cui manca sys.functions, o è solo qualcosa che non è stato considerato abbastanza importante da inserire nelle viste del catalogo sys? È disponibile in SQL Server 2008 ??

Salute, Marc


La risposta fornita da TimC (risposta il 22 gennaio alle 14:06) è preferibile rispetto all'utilizzo della vecchia tabella di sistema sysobjects, perché hai una colonna LAST_ALTER in INFORMATION_SCHEMA.ROUTINES che è simile alla colonna modify_date che esiste in sys.tables, sys.views, sys.procedures, ecc. Tuttavia, se stai usando la vista di sistema sys.objects più aggiornata, hai modify_date come in quelle tabelle. Il mio $ 0,02. Saluti,
-Matthew

1
@JuniorMayhe: ok - ecco il feedback sul suggerimento di Connect che ho inserito - votalo! :-)
marc_s

1
Penso che @marc_s abbia un buon punto: molte persone non riescono a capire perché non c'è sys.functions. Hai sys.foreign_keyse no sys.primary_keys. Ad ogni modo, vi chiedo di utilizzare il canale aperto di Microsoft per proporre e suggerire nuove funzionalità per le versioni future di SQL Server su connect.microsoft.com/SQLServer/Feedback Ho già aggiunto un feedback su sys.functions su connect.microsoft.com/ SQLServer / feedback / dettagli / 1127920
Junior Mayhé

Risposte:


117

Trovo che le UDF siano molto utili e le uso sempre.

Non sono sicuro di quale sia la logica di Microsoft per non includere un equivalente di sys.functions in SQL Server 2005 (o SQL Server 2008, per quanto ne so), ma è abbastanza facile eseguire il tuo:

CREATE VIEW my_sys_functions_equivalent
AS
SELECT *
FROM sys.objects
WHERE type IN ('FN', 'IF', 'TF')  -- scalar, inline table-valued, table-valued

7
Ciò dovrebbe includere anche i tipi di funzione CLR: "AF", "FS" e "FT". Vedere sys.objects descrizione colonna "tipo" qui: msdn.microsoft.com/en-us/library/ms190324.aspx
Triynko

4
"AF" non è considerata una "funzione" in termini di metadati dell'oggetto di SQL Server anche se sta per AGGREGATE_FUNCTION. È più chiaro che un aggregato è un tipo di oggetto diverso da altre funzioni definite dall'utente se si considera che si crea un nuovo aggregato utilizzando CREATE AGGREGATE invece di CREATE FUNCTION. I tipi di oggetto "FN", "IF", "TF", "FS" e "FT" sono i cinque tipi di funzione per ciò che SSMS (tramite SMO) genera durante lo scripting IF EXISTS ... DROP FUNCTION code.
Orlando Colamatteo

37

Un altro modo per elencare le funzioni consiste nell'utilizzare le viste INFORMATION_SCHEMA.

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

Secondo il sito Web Microsoft, "le viste dello schema delle informazioni forniscono una vista interna indipendente dalla tabella di sistema dei metadati di SQL Server. Le viste dello schema delle informazioni consentono alle applicazioni di funzionare correttamente anche se sono state apportate modifiche significative alle tabelle di sistema sottostanti". In altre parole, le tabelle di sistema sottostanti possono cambiare quando SQL viene aggiornato, ma le visualizzazioni dovrebbero rimanere le stesse.


Sì, grazie, conosco anche INFORMATION_SCHEMA - ma come utente di lunga data, sys.xxxx è ancora più facile - grazie per il promemoria!
marc_s

4
INFORMATION_SCHEMA sarebbe fantastico, ma non include l'intero corpo di procedure più grandi, il che rende meno che inutile se stai cercando nel corpo. Non è quello che non sai che ti metterà nei guai, ma quello che sai non è così ...
jmoreno

3
Le viste Information_Schema sono espressamente documentate come non affidabili per alcune cose. ad esempio "Non utilizzare le viste INFORMATION_SCHEMA per determinare lo schema di un oggetto. L'unico modo affidabile per trovare lo schema di un oggetto è interrogare la vista del catalogo sys.objects." da msdn.microsoft.com/en-us/library/ ms188757.aspx
David Eison

Mi piace questa risposta, perché la INFORMATION_SCHEMAquery restituisce risultati molto interessanti come IS_DETERMINISTIC(che volevo scoprire).
Tomasz Gandor

18

Questo è valido nel 2008 R2 per ciò che SSMS genera quando si crea uno script DROP di una funzione:

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
*/

1
Il tuo suggerimento di modifica dovrebbe essere un commento, non una modifica. la "funzione AF Aggregate" è chiaramente tratta dalla documentazione di MS (controlla il link), quindi questo post sembra del tutto corretto. Se non sei d'accordo: commenta . Non modificare. Se la gente ripetutamente rifiutati tua modifica questo dovrebbe essere un suggerimento che si sta forse facendo qualcosa di sbagliato, e non le altre persone.
Martin Tournoij

@Carpetsmoker "AF" non è considerata una "funzione" in termini di metadati degli oggetti di SQL Server anche se sta per AGGREGATE_FUNCTION. È più chiaro che un aggregato è un tipo di oggetto diverso da altre funzioni definite dall'utente se si considera che si crea un nuovo aggregato utilizzando CREATE AGGREGATE invece di CREATE FUNCTION. I tipi di oggetto "FN", "IF", "TF", "FS" e "FT" sono i cinque tipi di funzione per ciò che SSMS (tramite SMO) genera durante lo scripting IF EXISTS ... DROP FUNCTION code. È necessario accettare la mia modifica per ripristinare l'aggiunta errata di AF all'elenco dei tipi di funzione di SQL Server.
Orlando Colamatteo

5

È leggermente più dettagliato, ma dovrebbe fare esattamente la stessa cosa:

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

Per quanto posso vedere, non è nemmeno in SQL Server 2008.


1
Sì, è quello che ho fatto fondamentalmente io stesso per creare una vista "sys_functions" :-) Mi chiedevo solo perché non è nel prodotto fuori dagli schemi ....
marc_s

4

Questo non aggiunge nulla di nuovo, ma ho trovato quanto segue più facile da ricordare:

select * from sys.objects where type_desc like '%fun%'

Se si codice postale, campioni di XML o di dati, si prega di evidenziare quelle linee in editor di testo e fare clic sul pulsante "codice di campioni" ( { }) sulla barra degli strumenti Editor per ben formato e la sintassi evidenziarlo!
marc_s

Grazie, ma cerco di evitare il più possibile il "tutto" sys.objects.
marc_s

4

prova questo :

SELECT * FROM sys.objects
where type_desc = 'SQL_SCALAR_FUNCTION'

2

per inciso, non vorresti includere type = 'FS'?

name    type    type_desc
getNewsletterStats  FS  CLR_SCALAR_FUNCTION

questo è ciò a cui corrisponde l'elemento in sys.objects per la mia UDF che è derivata da una DLL esterna


2

Per estendere la risposta di @ LukeH, per restituire anche le definizioni di funzione è necessario un join alla sys.sql_modulestabella. Quindi la domanda per questo è:

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

dove quanto sopra mostra il nome della funzione, la sua definizione e l'identificatore dell'oggetto rispettivamente.


2

Per una descrizione più completa delle funzioni scalari, incluso il proprietario e il tipo restituito:

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

0

SQL 2000 specifica, leggera regolazione per il nome dell'oggetto:

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

O

SELECT *
FROM dbo.sysobjects
WHERE type IN ('FN', 'IF', 'TF')
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.