Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 查看SQL Server数据库对象列表时如何识别系统对象?_Sql Server_Sql Server 2008_Database Schema - Fatal编程技术网

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

Sql server 查看SQL Server数据库对象列表时如何识别系统对象?,sql-server,sql-server-2008,database-schema,Sql Server,Sql Server 2008,Database Schema,我试图列出服务器上所有数据库中的所有存储过程,但似乎无法可靠地筛选出系统对象。我使用的是: SELECT * FROM sysobjects WHERE id > 100 除了MSDB之外,它似乎在每个数据库中都能正常工作,MSDB中有大量具有正常ID的存储过程,但它们是系统存储过程。据我所知,我无法使用sysobjects表中的任何值筛选出系统存储的进程-其他人知道可以用于筛选的值吗 它们都标记为type=“p”,这意味着它是一个存储过程,但似乎没有标记来指定它是系统存储过程还是

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

SELECT *
  FROM sysobjects
 WHERE id > 100
除了MSDB之外,它似乎在每个数据库中都能正常工作,MSDB中有大量具有正常ID的存储过程,但它们是系统存储过程。据我所知,我无法使用sysobjects表中的任何值筛选出系统存储的进程-其他人知道可以用于筛选的值吗


它们都标记为type=“p”,这意味着它是一个存储过程,但似乎没有标记来指定它是系统存储过程还是用户存储过程。我可以为“IsMsShipped=0”使用sys.objects视图和过滤器,但我希望它也适用于SQL 2000,因此如果可能的话,我更愿意使用旧视图(如sysobjects)。

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

SELECT 
    *
FROM
   sys.objects
WHERE
   OBJECTPROPERTY(object_id, 'IsMSShipped') = 0
您可以更改为sys.tables,但它仍然有效,或者使用“type”列进行筛选。或者使用OBJECTPROPERTY(object_id,'IsProcedure')等

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

注2:也适用于SQL Server 2000:

SELECT 
    *
FROM
   sysobjects
WHERE
   OBJECTPROPERTY(id, 'IsMSShipped') = 0

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
在某些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在获取(非)系统对象列表时执行的代码。

这可能是我必须要做的,因为我在较新的系统视图中注意到了这个属性,但我希望有一个易于访问的属性也能在2000年工作。呃。。。OBJECTPROPERTY也在SQLServer2000中——嗯,这是肯定的,我刚刚确认我的脚本仍然在2000服务器上运行。谢谢你的帮助!我认为@gbn是正确的,所以我相信
SELECT*FROM sysobjects,其中OBJECTPROPERTY(id,'IsMSShipped')=0
将在2000年起作用。对吗?