查看SQL Server数据库对象列表时如何识别系统对象?

Sql*_*yan 2 sql-server sql-server-2008 database-schema

我正在尝试列出我服务器上所有数据库中的所有存储过程,而我似乎无法可靠地过滤掉系统对象.我用的是:

SELECT *
  FROM sysobjects
 WHERE id > 100
Run Code Online (Sandbox Code Playgroud)

这似乎在除MSDB之外的每个数据库中都能正常工作,MSDB充满了大量具有正常ID的存储过程,但它们是系统存储的过程.据我所知,我无法使用sysobjects表中的任何值过滤掉系统存储过程 - 其他人是否知道可用于过滤的值?

它们都标记为type ="P",这意味着它是一个存储过程,但似乎没有标志来指定它是系统存储过程还是用户存储过程.我可以使用sys.objects视图并过滤"IsMsShipped = 0",但我想要的东西也适用于SQL 2000,所以如果可能的话,我更喜欢使用较旧的视图(如sysobjects).

gbn*_*gbn 5

这适用于我的SQL Server 2008 R2安装.除了用户数据库之外,我什么都看不到

SELECT 
    *
FROM
   sys.objects
WHERE
   OBJECTPROPERTY(object_id, 'IsMSShipped') = 0
Run Code Online (Sandbox Code Playgroud)

你可以改变sys.objects说,sys.tables它仍然有效,或使用"类型"列进行过滤.或者使用OBJECTPROPERTY(object_id,'IsProcedure')等.

注意:它是SQL Server 2005+中的sys.objects

注意2:OBJECTPROPERTY也适用于SQL Server 2000:

SELECT 
    *
FROM
   sysobjects
WHERE
   OBJECTPROPERTY(id, 'IsMSShipped') = 0
Run Code Online (Sandbox Code Playgroud)