我试图列出服务器上所有数据库中的所有存储过程,但我似乎无法可靠地筛选出系统对象。我使用的是:
SELECT *
FROM sysobjects
WHERE id > 100
它似乎在每个数据库中都工作得很好,除了MSDB,它充满了大量存储的进程,具有正常的in,但它们是系统存储的进程。据我所知,我无法使用sysobjects表中的任何值过滤掉系统存储的procs --有没有其他人知道可以用来过滤的值?
它们都被标记为type="P",这意味着它是一个存储的进程,但似乎没有标志来指定它是系统存储的进程还是用户存储的进程。我可以使用sys.objects视图和"IsMsShipped=0“筛选器,但我希望它也能在SQL2000上工作,所以如果可能的话,我更喜欢使用旧的视图(比如sysobjects)。
发布于 2011-06-16 00:43:11
这适用于我安装的SQL Server2008 R2。除了用户数据库之外,我什么也看不到
SELECT
*
FROM
sys.objects
WHERE
OBJECTPROPERTY(object_id, 'IsMSShipped') = 0
您可以将类型更改为sys.tables,但它仍然有效,或者使用“sys.objects”列进行过滤。或者使用OBJECTPROPERTY(object_id,'IsProcedure')等。
注意:在SQL Server 2005+中它是sys.objects
注2:OBJECTPROPERTY也适用于SQL Server2000:
SELECT
*
FROM
sysobjects
WHERE
OBJECTPROPERTY(id, 'IsMSShipped') = 0
发布于 2011-06-16 00:43:11
SQL Server 2005及更高版本
SELECT
SCHEMA_NAME(obj.schema_id) AS schema_name,
obj.name AS proc_name
FROM
sys.procedures obj WITH(NOLOCK)
ORDER BY
schema_name,
proc_name
SQL Server 2000
SELECT
USER_NAME(obj.uid) AS user_name,
obj.name AS proc_name,
FROM
sysobjects obj WITH(NOLOCK)
WHERE
(obj.status & 0x80000000) = 0
AND RTRIM(obj.xtype) IN ('P', 'RF')
ORDER BY
user_name,
proc_name
发布于 2021-02-27 06:49:20
在某些SQL版本中(我不知道这是从哪个版本开始的),至少有一种情况下,数据库可以包含具有设置为false的IsMSShipped属性的系统对象。
使用将数据库图表添加到数据库的功能,通常会在初始安装之后添加以下对象,例如,在SSMS中的用户发起创建数据库图表的请求时。
我会将先前接受的答案修改为:
SELECT
*
FROM
sysobjects obj
WHERE
OBJECTPROPERTY(obj.id, 'IsMSShipped') = 0
AND (CAST(
CASE
WHEN (
SELECT
major_id
FROM
sys.extended_properties
WHERE
major_id = obj.id and
minor_id = 0 and
class = 1 and
name = N'microsoft_database_tools_support')
IS NOT NULL then 1
ELSE 0
END as bit)) = 0
这个附加子查询取自SSMS在获取(非)系统对象列表时执行的代码。
https://stackoverflow.com/questions/6361188
复制相似问题