如何列出所有非系统存储过程?

时间:2009-12-29 18:54:01

标签: sql sql-server-2005

我想创建一个查询以列出所有用户定义的存储过程,不包括那些系统存储过程,考虑到:

  1. 检查名称如“sp_”不起作用,因为存在以“sp _”开头的用户存储过程。
  2. 检查属性is_ms_shipped不起作用,因为系统存储过程具有该标志= 0,例如:sp_alterdiagram(它不是MSShipped,但显示在SQL Server Management Studio中的系统存储过程下)。
  3. 必须有一个属性或标志,因为您可以在SQL 2005中的单独文件夹中看到“系统存储过程”。有人知道吗?


    编辑:以下建议的组合对我有用:

    select *
    from 
        sys.objects             O LEFT OUTER JOIN
        sys.extended_properties E ON O.object_id = E.major_id
    WHERE
        O.name IS NOT NULL
        AND ISNULL(O.is_ms_shipped, 0) = 0
        AND ISNULL(E.name, '') <> 'microsoft_database_tools_support'
        AND O.type_desc = 'SQL_STORED_PROCEDURE'
    ORDER BY O.name
    

6 个答案:

答案 0 :(得分:14)

你应该使用这样的东西:

select * from sys.procedures where is_ms_shipped = 0

你可以猜到,关键是 is_ms_shipped 属性(它也存在于sys.objects视图中)。

更新。最初错过了关于is_ms_shipped的观点。

这是Management Studio实际用于检索“系统存储过程”列表的代码(条件)

 CAST(
 case 
 when sp.is_ms_shipped = 1 then 1
 when (
    select 
        major_id 
    from 
        sys.extended_properties 
    where 
        major_id = sp.object_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) = 1

这里sp指的是sys.all_objects系统视图。

答案 1 :(得分:4)

使用上面的第一个答案,我写了以下内容,适用于我的用途:

select
        *
    from
        INFORMATION_SCHEMA.ROUTINES as ISR
    where
        ISR.ROUTINE_TYPE = 'PROCEDURE' and
        ObjectProperty (Object_Id (ISR.ROUTINE_NAME), 'IsMSShipped') = 0 and
        (
            select 
                major_id 
            from 
                sys.extended_properties 
            where 
                major_id = object_id(ISR.ROUTINE_NAME) and 
                minor_id = 0 and 
                class = 1 and 
                name = N'microsoft_database_tools_support'
        ) is null
    order by
        ISR.ROUTINE_CATALOG,
        ISR.ROUTINE_SCHEMA,
        ISR.ROUTINE_NAME

答案 2 :(得分:4)

我只会投入我的“改进版”的SQL(意识到格式化是个人偏好的问题):

SELECT *
FROM [sys].[procedures] sp
WHERE is_ms_shipped = 0
AND NOT EXISTS (
    select ep.[major_id]
    from [sys].[extended_properties] ep
    where ep.[major_id] = sp.[object_id]
    and ep.[minor_id] = 0
    and ep.[class] = 1
    and ep.[name] = N'microsoft_database_tools_support')

答案 3 :(得分:3)

以下是我根据上述解决方案所做的工作:

select * from sys.procedures 
 where object_id not in(select major_id from sys.extended_properties)

此单个查询适用于SQL Server 2008,但尚未测试其他版本。

更新 - 2018-11-28

也适用于SQL Server 2014

答案 4 :(得分:2)

有三种“系统”程序:

  • 真正的SQL过程,即'sys'模式中的过程,将作为mssqlsystemresource数据库中的普通过程找到。
  • 各种组件安装的普通用户程序。这些是复制过程,数据收集,变更跟踪,声明性管理框架等。它们根本不是系统,它们生活在'dbo'模式中,只是作为'系统'销售。有些可以通过'IsMSShipped'标志来识别,但不是全部。
  • launguage伪程序。这些是被称为程序的T-SQL语句,你不会在任何地方找到它们。

答案 5 :(得分:1)

试试这个

select * from DatabaseName.information_schema.routines where routine_type = 'PROCEDURE'

如果由于某种原因你在master数据库中有非系统存储过程,你可以使用查询(这将过滤掉MOST系统存储过程:

select * from master.information_schema.routines where routine_type = 'PROCEDURE' and
Left(Routine_Name, 3) NOT IN ('sp_', 'xp_', 'ms_')

您可以在以下答案中看到更多信息

Query that returns list of all Stored Procedures