119

SQL Server 2005sys.XXX对我经常使用的系统目录有很好的看法。

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

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

是否缺少特定原因sys.functions,或者只是一些被认为不够重要而无法放入sys目录视图的原因?它在 SQL Server 2008 中可用吗?

4

10 回答 10

127

我发现 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
于 2009-01-22T11:35:51.397 回答
38

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

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

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

于 2009-01-22T14:06:47.287 回答
19

这在 2008 R2 中有效,根据 SSMS 在您编写函数的 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
*/
于 2011-03-01T18:37:38.563 回答
5

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

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

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

于 2009-01-22T11:35:41.087 回答
4

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

select * from sys.objects where type_desc like '%fun%'
于 2011-05-23T11:16:18.070 回答
4

试试这个 :

SELECT * FROM sys.objects
where type_desc = 'SQL_SCALAR_FUNCTION'
于 2014-01-27T10:02:11.050 回答
2

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

name    type    type_desc
getNewsletterStats  FS  CLR_SCALAR_FUNCTION

这就是 sys.objects 中的项目对应于我的 UDF 的内容,该 UDF 派生自外部 DLL

于 2009-07-07T11:26:15.823 回答
2

要扩展@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

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

于 2012-03-08T15:01:06.083 回答
2

有关标量函数的更完整描述,包括所有者和返回类型:

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';
于 2014-03-27T18:14:52.293 回答
0

SQL 2000具体的,对对象名称稍作调整:

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

或者

SELECT *
FROM dbo.sysobjects
WHERE type IN ('FN', 'IF', 'TF')
于 2015-06-03T00:06:08.567 回答