SQL Server-“ sys.functions”在哪里?


103

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

让我感到困惑的是:为什么没有“ sys.procedures”视图可以查看有关存储过程的信息,却没有“ sys.functions”视图可以看到与存储过程相同的信息?

没有人使用存储的功能吗?我发现它们非常方便,例如计算列之类的!

是否有特定原因导致sys.functions丢失,或者仅仅是一些没有被认为重要到足以放入sys目录视图中的东西?SQL Server 2008中可用吗?

干杯,马克


与使用旧版sysobjects系统表相比,TimC提供的答案(于1月22日14:06回答)更可取,因为您在INFORMATION_SCHEMA.ROUTINES中具有LAST_ALTERED列,该列与sys.tables中存在的Modify_date列相似, sys.views,sys.procedures等。但是,如果您使用更新的sys.objects系统视图,则具有与这些表相同的Modify_date。我的$ 0.02。干杯,
-Matthew

1
@JuniorMayhe:好的-这是我输入的Connect建议反馈 -快投票吧!:-)
marc_s 2015年

1
我认为@marc_s有一个好处:许多人无法理解为什么没有sys.functions。你有sys.foreign_keys没有sys.primary_keys。无论如何,我问你们使用微软的开放渠道提出,并提出新的功能在upcomming的SQL Server版本connect.microsoft.com/SQLServer/Feedback我已经添加了关于在sys.functions反馈connect.microsoft.com/ SQLServer / feedback / details / 1127920
JuniorMayhé,2015年

Answers:


116

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

我不确定Microsoft的基本原理是不包括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

7
这还应包括CLR功能类型:“ AF”,“ FS”和“ FT”。请参阅此处的sys.objects“类型”列说明:msdn.microsoft.com/zh-cn/library/ms190324.aspx
Triynko 2011年

4
就SQL Server的对象元数据而言,“ AF”不被视为“函数”,即使它代表AGGREGATE_FUNCTION。当您考虑使用CREATE AGGREGATE而不是CREATE FUNCTION创建新的聚合时,很明显,Aggregate是与其他用户定义函数不同的对象类型。在编写IF EXISTS ... DROP FUNCTION代码脚本时,SSMS(通过SMO)生成的对象类型为“ FN”,“ IF”,“ TF”,“ FS”和“ FT”。
奥兰多Colamatteo 2012年

37

列出功能的另一种方法是利用INFORMATION_SCHEMA视图。

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

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


是的,谢谢,我也知道INFORMATION_SCHEMA-但是作为长期用户,sys.xxxx仍然更容易使用-感谢您的提醒!
marc_s

4
INFORMATION_SCHEMA会很棒,但是它不包含较大程序的全部内容,因此,如果您在内部进行搜索,那么它的价值就会变得一文不值。并不是您不知道会惹上麻烦,而是您知道那不是……
jmoreno 2012年

3
明确记录了Information_Schema视图在某些方面不可靠。例如:“不要使用INFORMATION_SCHEMA视图来确定对象的架构。查找对象的架构的唯一可靠方法是查询sys.objects目录视图。” from msdn.microsoft.com/zh-cn/library/ ms188757.aspx
David Eison 2012年

我喜欢这个答案,因为INFORMATION_SCHEMA查询返回的结果非常有趣,例如IS_DETERMINISTIC(我想找出)。
Tomasz Gandor

18

根据您在编写函数的DROP脚本时SSMS生成的内容,这在2008 R2中有效:

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
您的编辑建议应该是评论,而不是编辑。“ AF聚合功能”显然来自MS文档(请查看链接),因此此帖子看起来完全正确。如果您不同意:请评论。不编辑。如果有人反复拒绝您的编辑,这应该暗示可能是在做错事,而不是其他人。
马丁·图尔诺伊

就SQL Server的对象元数据而言,@ Carpetsmoker“ AF”不被视为“函数”,即使它代表AGGREGATE_FUNCTION。当您考虑使用CREATE AGGREGATE而不是CREATE FUNCTION创建新的聚合时,很明显,Aggregate是与其他用户定义函数不同的对象类型。在编写IF EXISTS ... DROP FUNCTION代码脚本时,SSMS(通过SMO)生成的对象类型为“ FN”,“ IF”,“ TF”,“ FS”和“ FT”。您应该接受我的编辑,以将不正确的AF添加还原到SQL Server函数类型列表。
奥兰多Colamatteo

5

它有点冗长,但这应该做的完全一样:

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

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


1
是的,这就是我基本上没有自己创建一个“sys_functions”视图:-)只是想知道为什么它不是在产品开箱....
marc_s

4

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

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

如果发布代码,XML或数据示例,在文本编辑器中突出显示这些行,然后单击{ }编辑器工具栏上的“代码示例”按钮(),以很好地格式化和语法突出显示它!
marc_s

谢谢,但是我尽量避免“拥有一切” sys.objects
marc_s


2

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

name    type    type_desc
getNewsletterStats  FS  CLR_SCALAR_FUNCTION

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


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

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


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

0

SQL 2000 对对象名称进行特定的略微调整:

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

要么

SELECT *
FROM dbo.sysobjects
WHERE type IN ('FN', 'IF', 'TF')
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.