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

bub*_*uro 18 sql sql-server-2005

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

  1. 检查名称如"sp_"不起作用,因为存在以"sp_"开头的用户存储过程.
  2. 检查属性is_ms_shipped不起作用,因为存在具有该标志= 0的系统存储过程,例如:sp_alterdiagram(它不是MSShipped但显示在SQL Server Management Studio中的系统存储过程下).

因为你可以在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
Run Code Online (Sandbox Code Playgroud)

Ale*_*exS 14

你应该使用这样的东西:

select * from sys.procedures where is_ms_shipped = 0
Run Code Online (Sandbox Code Playgroud)

您可以猜到,关键在于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
Run Code Online (Sandbox Code Playgroud)

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