如何在SQL Server中检查存储过程或函数的最后更改日期

221

我需要检查函数最后一次修改的时间。我知道如何检查创建日期(在SQL Server Management Studio中的函数属性窗口中可以找到)。


我发现在SQL Server 2000中无法检查修改日期(请看这篇帖子:在SQL Server 2000中是否有办法确定存储过程的最后修改时间?


在SQL Server 2008中是否有可能检查它?微软是否在系统表中添加了一些新功能以允许检查它?

9个回答

457
SELECT name, create_date, modify_date 
FROM sys.objects
WHERE type = 'P'
ORDER BY modify_date DESC

函数的 type 应为 FN,而不是过程(P)。或者您可以根据名称列进行筛选。


5
似乎某些权限会导致此查询结果被省略,即使有返回结果。我们观察到用户权限不同会得到不同的结果,但我还没有确定涉及哪些权限。简而言之,如果可以,请使用SA身份运行此查询以确保您看到全部结果。 - Ryan Guill
3
您说得确实正确。http://msdn.microsoft.com/en-us/library/ms190324%28v=sql.105%29.aspx “在 SQL Server 2005 及更高版本中,目录视图中元数据的可见性仅限于用户拥有或已被授予某些权限的可保护对象。有关更多信息,请参阅元数据可见性配置。” - Chris Diver
2
一个警告。如果OP仅指通过ALTER DDL语句对模块进行的更改,则modify_date可能会误导。例如,如果在模块上执行sys.sp_refreshsqlmodule,则即使模块的代码没有实质性变化,modify_date也会更改。 - gravidThoughts
如何仅获取指定数据库中的存储过程?! - Irfan
2
在 WHERE 行之后添加 AND name = '指定的存储过程',其中 指定的存储过程 是您想要查找的存储过程的名称。 - TylerH

49

对于存储过程,请尝试以下方法:

SELECT name, create_date, modify_date
FROM sys.objects
WHERE type = 'P'
AND name = 'myProc'

1
这应该是被接受的答案,因为它简单明了。 - Just a HK developer

16

这是找到一个函数的正确解决方案:

SELECT name, create_date, modify_date
FROM sys.objects
WHERE type = 'fn'
AND name = 'fn_NAME'

12

我发现这被列为新技术

这非常详细

SELECT * FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_TYPE = N'PROCEDURE' and ROUTINE_SCHEMA = N'dbo' 
order by  LAST_ALTERED desc

SELECT * FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_TYPE = N'PROCEDURE' and ROUTINE_SCHEMA = N'dbo' 
order by  CREATED desc 


SELECT * FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_TYPE = N'FUNCTION' and ROUTINE_SCHEMA = N'dbo' 
order by  LAST_ALTERED desc

SELECT * FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_TYPE = N'FUNCTION' and ROUTINE_SCHEMA = N'dbo' 
order by  CREATED desc 

好奇为什么您想从此视图中检索数据而不使用sys.objects。这是因为您想获取有关函数/过程的额外详细信息吗?我会说我在一个数据库中注意到,与information_schema.routines修改日期相比,sys.objects显示了不同的修改日期... - Izulien

7
在最新版本(2012或更高版本)中,我们可以使用以下查询获取修改后的存储过程详细信息。
SELECT create_date, modify_date, name FROM sys.procedures 
ORDER BY modify_date DESC

已经使用sys.procedures在存储过程中搜索文本,非常好用,我还可以获取日期。 - ourmandave

5

对于 SQL 2000,我会使用:

SELECT name, crdate, refdate 
FROM sysobjects
WHERE type = 'P' 
ORDER BY refdate desc

2008年怎么样?这不是个问题吗? - NREZ
@NREZ对sysobjects的查询在2008上得到支持,所以这将起作用。 - Paul
refdate 不是最后修改日期。请检查 sys.object 和 sysobjects 之间的日期差异。 - access_granted

3
您可以使用这个工具来检查按日期排序的 函数存储过程 的修改日期:
SELECT 'Stored procedure' as [Type] ,name, create_date, modify_date 
FROM sys.objects
WHERE type = 'P' 

UNION all

Select 'Function' as [Type],name, create_date, modify_date
FROM sys.objects
WHERE type = 'FN'
ORDER BY modify_date DESC

或:
SELECT type ,name, create_date, modify_date 
FROM sys.objects
WHERE type in('P','FN') 
ORDER BY modify_date DESC
-- this one shows type like : FN for function and P for stored procedure

结果将会是这样的:
Type                 |  name      | create_date              |  modify_date
'Stored procedure'   | 'firstSp'  | 2018-08-04 07:36:40.890  |  2019-09-05 05:18:53.157
'Stored procedure'   | 'secondSp' | 2017-10-15 19:39:27.950  |  2019-09-05 05:15:14.963
'Function'           | 'firstFn'  | 2019-09-05 05:08:53.707  |  2019-09-05 05:08:53.707

1
SELECT *
FROM sys.objects
WHERE type IN ('FN', 'IF', 'TF') 
AND name = 'dgdsgds'

1
我可以请求您在回答中添加更多背景信息吗?仅有代码的答案很难理解。如果您能在帖子中添加更多信息,将有助于提问者和未来的读者。 - RBT

0
SELECT name, created_at, updated_at 
FROM table_name.column_name
WHERE type = 'soemthing'
ORDER BY updated_at DESC ;

我希望这能帮到你


您的答案可以通过添加更多支持信息来改进,例如引用或文档,以便他人确认您的答案是否正确,请[编辑]。您可以在帮助中心找到有关如何撰写良好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接