SQL Server的 – “sys.functions”在哪里?

SQL Server 2005在我经常使用的系统目录上有很好的sys.XXX视图。

什么绊倒我是这样的:为什么有一个“sys.procedures”视图来查看有关您的存储过程的信息,但没有“sys.functions”视图看到相同的存储function?

有没有人使用存储的function? 我发现他们非常方便,例如计算列等!

是否有一个特定的原因sys.functions丢失,或者它只是被认为是不够重要的东西放进sys目录视图? 它是否在SQL Server 2008中可用?

干杯,马克

我发现UDF非常方便,我一直都在使用它们。

我不确定微软的理由是不包括在SQL Server 2005(或SQL Server 2008,据我所知)中的sys.functions等价物,但是很容易推出自己的:

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

列出函数的另一种方法是利用INFORMATION_SCHEMA视图。

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

根据微软网站“信息模式视图提供了一个内部的,系统表独立的SQL Server元数据视图。信息模式视图使得应用程序能够正常工作,尽pipe对底层系统表进行了重大改变”。 换句话说,底层的系统表可能会随着SQL升级而改变,但是视图应该保持不变。

这在2008 R2中是有效的,当你编写一个函数的DROP脚本时,

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

它稍微更冗长,但是这应该完全相同的事情:

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

据我所见,它也不在SQL Server 2008中。

这不会添加任何新内容,但我发现以下更容易记住:

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

尝试这个 :

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

顺便说一句,你不想包括type ='FS'?

 name type type_desc getNewsletterStats FS CLR_SCALAR_FUNCTION 

这就是sys.objects中的项目对应于我的从外部DLL派生的UDF

为了扩展@ LukeH的回答,要返回函数定义,还需要joinsys.sql_modules表。 所以对此的查询是:

 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 

上面分别显示函数名称,定义和对象标识符。

有关标量函数(包括所有者和返回types)的更完整说明:

 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特定的,稍微调整一下对象名称:

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

要么

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