簡體   English   中英

如何列出所有非系統存儲過程?

[英]How do I list all non-system stored procedures?

我想創建一個查詢列出所有用戶定義的存儲過程,不包括那些系統存儲過程,考慮到:

  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

你應該使用這樣的東西:

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

“系統”程序有三種:

  • 真正的SQL過程,即'sys'模式中的過程,將作為mssqlsystemresource數據庫中的普通過程找到。
  • 各種組件安裝的普通用戶程序。 這些是復制過程,數據收集,變更跟蹤,聲明性管理框架等。 它們根本不是系統,它們生活在'dbo'模式中,只是作為'系統'銷售。 有些可以通過'IsMSShipped'標志來識別,但不是全部。
  • launguage偽程序。 這些是被稱為過程的T-SQL語句,您無法在任何地方找到它們。

試試這個

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM