[英]How do I list all non-system stored procedures?
我想創建一個查詢列出所有用戶定義的存儲過程,不包括那些系統存儲過程,考慮到:
因為你可以在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
你應該使用這樣的東西:
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系統視圖。
我只會投入我的“改進”版本的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')
使用上面的第一個答案,我寫了以下適用於我的用途:
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
以下是我根據上述解決方案所做的工作:
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
“系統”程序有三種:
試試這個
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_')
您在以下答案中看到更多信息
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.