我想创建一个查询以列出所有用户定义的存储过程,不包括那些系统存储过程,考虑到:
必须有一个属性或标志,因为您可以在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
答案 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)
有三种“系统”程序:
答案 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_')
您可以在以下答案中看到更多信息