首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在查看SQL Server数据库对象列表时识别系统对象?

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

Stack Overflow用户
提问于 2011-06-16 00:40:36
回答 3查看 8K关注 0票数 3

我试图列出服务器上所有数据库中的所有存储过程,但我似乎无法可靠地筛选出系统对象。我使用的是:

代码语言:javascript
运行
复制
SELECT *
  FROM sysobjects
 WHERE id > 100

它似乎在每个数据库中都工作得很好,除了MSDB,它充满了大量存储的进程,具有正常的in,但它们是系统存储的进程。据我所知,我无法使用sysobjects表中的任何值过滤掉系统存储的procs --有没有其他人知道可以用来过滤的值?

它们都被标记为type="P",这意味着它是一个存储的进程,但似乎没有标志来指定它是系统存储的进程还是用户存储的进程。我可以使用sys.objects视图和"IsMsShipped=0“筛选器,但我希望它也能在SQL2000上工作,所以如果可能的话,我更喜欢使用旧的视图(比如sysobjects)。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-06-16 00:43:11

这适用于我安装的SQL Server2008 R2。除了用户数据库之外,我什么也看不到

代码语言:javascript
运行
复制
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:

代码语言:javascript
运行
复制
SELECT 
    *
FROM
   sysobjects
WHERE
   OBJECTPROPERTY(id, 'IsMSShipped') = 0
票数 5
EN

Stack Overflow用户

发布于 2011-06-16 00:43:11

SQL Server 2005及更高版本

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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
票数 2
EN

Stack Overflow用户

发布于 2021-02-27 06:49:20

在某些SQL版本中(我不知道这是从哪个版本开始的),至少有一种情况下,数据库可以包含具有设置为false的IsMSShipped属性的系统对象。

使用将数据库图表添加到数据库的功能,通常会在初始安装之后添加以下对象,例如,在SSMS中的用户发起创建数据库图表的请求时。

我会将先前接受的答案修改为:

代码语言:javascript
运行
复制
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在获取(非)系统对象列表时执行的代码。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6361188

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档