Domanda

SQL Server 2005 offre ottime viste sys.XXX sul catalogo di sistema che utilizzo di frequente.

Ciò che mi fa inciampare è questo: perché c'è un "sys.procedures"? visualizzare per visualizzare informazioni sulle procedure memorizzate, ma non sono presenti "funzioni di sistema". vedi per vedere lo stesso per le tue funzioni memorizzate?

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

C'è un motivo specifico per cui mancano sys.funzioni o è solo qualcosa che non è stato considerato abbastanza importante da inserire nelle viste del catalogo sys ?? È disponibile in SQL Server 2008 ??

Saluti, Marc

È stato utile?

Soluzione

Trovo che gli UDF siano molto utili e li uso sempre.

Non sono sicuro di quale sia la logica di Microsoft per non includere un equivalente sys.functions in SQL Server 2005 (o SQL Server 2008, per quanto posso dire), ma è abbastanza facile da implementare:

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

Altri suggerimenti

Un altro modo per elencare le funzioni è utilizzare le viste INFORMATION_SCHEMA.

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

Secondo il sito Web Microsoft, le viste dello schema di informazioni forniscono una vista interna indipendente dalla tabella di sistema dei metadati di SQL Server. Le viste dello schema di 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 potrebbero cambiare con l'aggiornamento di SQL, ma le visualizzazioni dovrebbero rimanere invariate.

Questo è valido nel 2008 R2 per ciò che SSMS genera quando si esegue lo script di un 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
*/

È leggermente più dettagliato, ma questo 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.

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

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

prova questo:

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

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

name    type    type_desc
getNewsletterStats  FS  CLR_SCALAR_FUNCTION

è ciò a cui corrisponde l'elemento in sys.objects per il mio UDF che è derivato da una DLL esterna

Per estendere la risposta di @ LukeH, per restituire anche le definizioni delle funzioni è necessario unire la tabella sys.sql_modules . Quindi la query 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 sopra mostra rispettivamente il nome della funzione, la sua definizione e l'identificatore dell'oggetto.

Per una descrizione più completa delle funzioni scalari tra cui proprietario e 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';

SQL 2000 specifico, 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')
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top