1. 程式人生 > >SQLServer 2005中如何列所有儲存過程

SQLServer 2005中如何列所有儲存過程

對於資料庫管理員來說,可以經常想了解一些之前未聽說過的儲存過程,特別是無文件型別的儲存過程。或許是用這些儲存過程,能夠簡化日常的資料管理。

  為了查詢這些儲存過程,你可以花時間在網際網路搜尋,檢視一些你還未知道的儲存過程,也許在一兩個小時您可能會發現你想要...也許你很幸運的找到,其他人在他們的文章中列出所有的儲存過程 ,函式和檢視,並介紹瞭如何使用這些儲存過程。

  但其實,您可以在一分鐘之內就可以自己列出這些儲存過程、函式和檢視的清單!這份名單甚至包括SQL Server中所有無文件的儲存過程。通過這個清單,你就可以確定你所想要找的儲存過程。

  SQL Server 2005實際上儲存了所有儲存過程的列表,包括有文件的、無文件的,甚至是使用者自定義的!所有這些資訊,都包含在系統表中。最簡單的方法是使用一個系統檢視,特別是sys.all_objects這個檢視來查閱。

  您也可以使用sys.procedures目錄檢視,但我的測試結果,發現這個檢視會過濾掉一些儲存過程。

  您也可以使用系統儲存過程sp_stored_procedures返回當前環境中的儲存過程列表 ,但這個儲存過程同樣也限制了儲存過程返回值。

  通過對比,我覺得:如果想獲得SQL Server 2005中所有的儲存程式,建議使用sys.all_objects這個系統檢視,sys.Procedures或sp_Stored_Procedures這兩個檢視會因為某些未知原因,過濾掉一些內容,造成資訊不全。

  儲存過程資訊是儲存在各自使用者資料庫中的系統表中的。SQL Server 2005儲存了儲存過程的唯一標識資訊,如儲存過程的名稱、建立時間、修改時間、是否來自微軟等等。

  如何確保所有的使用者資料庫都能夠自動建立這些儲存過程呢?

  當SQL Server部署完成後,微軟提供的儲存過程,是儲存在master資料庫中的。當您新建一個數據庫時,master資料庫將作為模板資料庫,因此,master資料庫中的所有儲存過程將自動建立到你所新建的資料庫中。

  如果你想建立一個儲存過程,並希望能夠自動分發到所有的資料庫中,你可以在master資料庫中建立該儲存過程,這樣之後新建立的資料庫中,將自動包含你新建的這個儲存過程; 但對於之前已經存在的資料庫,你仍需要到每個資料庫中手動建立這個儲存過程。

  一、列出所有的儲存過程

  以下程式碼列出了SQL Server 2005中存在的所有儲存過程。

  USE [your_database_name_here];
  GO
  SELECT * FROM sys.all_objects
  WHERE ([type] = 'P' OR [type] = 'X' OR [type] = 'PC')
  ORDER BY [name];
  GO

  如果您已經安裝了SQL Server 2005,並使用了所有的預設設定時,你將看到類似一下介面:


  上面這個命令,通過Type物件進行過濾。從下表中,你可以確定自己所需的物件的型別,然後根據你的實際情況,調整WHERE子句中的型別。

  此列表僅列出了意見,職能和程式。

二、使用者自定義儲存過程

  在日常使用中,另一個欄位“is_ms_shipped”也經常用來篩選記錄。該欄位用來判斷儲存過程是有微軟釋出的 ,如果最初是由微軟釋出的,則該欄位的值為0; 如果不是由微軟釋出的,則該欄位的值為1 。

  在上面的T-SQL語句的基礎上,您只要增加個限制條件“and [ is_ms_shipped ] = 0 ”,就可以找到不是微軟建立的儲存過程,這些或許是你或者第三方軟體商訪問資料庫時建立的。如果您只想看看微軟提供的儲存過程,只要將值從0到1即可 。

  下面舉例說明,通過一個T-SQL程式碼演示如何獲取只有使用者定義的儲存過程。


  USE [your_database_name_here];
  GO
  SELECT * FROM sys.all_objects
  WHERE ([type] = 'P' OR [type] = 'X' OR [type] = 'PC')
  AND [is_ms_shipped] = 0
  ORDER BY [name];
  GO
  需要注意的是,這個語句的執行結果,因每個人的資料庫的情況不同,而得到不同的記錄列表。情況而異。執行之後,將看到類似下圖的輸出結果。
  三、小結

  通過上面的例子可以看到,通過少量程式碼,我們就可以很容易地、快速地獲得自己所用的SQL Server 的儲存過程列表,你不必在一個個網站中搜索這些儲存過程了。你可能會學到一個之前自己花了很大精力編寫的複雜指令碼,現在直接用一個儲存過程就可以實現同樣的效果了。

  請記住,當使用一個不能確定來源或結果的儲存過程,應該在測試系統先驗證; 從來沒有使用任何沒有得到徹底的測試在生產環境中。

  本文只是告訴各位可以用來獲得SQL Server 2005中所有儲存過程的方法,但不是鼓勵你隨意使用任何型別的儲存過程,特別是無文件型別的。Microsoft一再宣告:微軟對所有無文件的儲存過程,擴充套件儲存過程,函式和檢視,均不提供任何相關的支援。

 SELECT distinct name FROM
sys.all_objects join syscomments
on sys.all_objects.object_id=syscomments.id
WHERE ([type] = 'P' OR [type] = 'X' OR [type] = 'PC')
and (text like '%P_RefundLog_T%' or text like '%P_RefundBalance_T%')
AND [is_ms_shipped] = 0
ORDER BY [name]

sp_helptext sp_helptext