SQL Server - where is "sys.functions"?

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

让我困惑的是: 为什么有一个 sys.procedures视图可以查看有关存储过程的信息,而没有一个 sys.functions视图可以查看存储函数的相同信息?

难道没有人使用存储函数吗? 我发现它们对于诸如计算列等非常方便!

sys.functions丢失的具体原因是什么,还是仅仅是因为某些东西被认为不够重要,不足以放入 sys目录视图?它在 SQLServer2008中可用吗?

84335 次浏览

它稍微有点冗长,但这应该做完全相同的事情:

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

As far as I can see, it's not in SQL Server 2008 either.

I find UDFs are very handy and I use them all the time.

我不知道微软为什么不在 SQL Server 2005(或者 SQL Server 2008,就我所知)中包含一个相当于 sys.function 的函数,但是很容易就可以推出自己的:

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

列出函数的另一种方法是使用 INFORATION _ SCHEMA 视图。

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

根据 Microsoft 网站“ Information schema 视图提供 SQL Server 元数据的独立于系统表的内部视图。信息模式视图使应用程序能够正常工作,尽管对基础系统表做了重大更改”。换句话说,底层的 System 表可能随着 SQL 的升级而改变,但是视图应该保持不变。

顺便说一下,您不想包含 type = ‘ FS’吗?

name    type    type_desc
getNewsletterStats  FS  CLR_SCALAR_FUNCTION

对于从外部 DLL 派生出来的 UDF,sys.object 中的项就与它相对应

这在2008年的 R2中是有效的,当你编写一个函数的 DROP 脚本时,SSMS 会生成:

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_desc like '%fun%'

要扩展@LukeH 的答案,还需要连接到 sys.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

where the above displays the function name, its definition and the object identifier respectively.

试试这个:

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

有关标量函数(包括 owner 和 return 类型)的更全面描述,请参见:

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