2015-08-21 34 views
0

我試圖找到驗證所有sql server存儲過程的方法。我曾嘗試使用sp_recompile和​​,但它不起作用。檢查Sql Server中存儲過程的有效性

例如,這個存儲過程編譯沒有問題,雖然表中沒有存在

ALTER PROCEDURE sp_Foo 
WITH RECOMPILE 
AS 
BEGIN 
    SELECT Foo, Bar 
    FROM Table_That_Dont_Exist 
END 

當我嘗試執行它引發錯誤。

Msg 208, Level 16, State 1, Procedure sp_Foo, Line 5 
Invalid object name 'Table_That_Dont_Exist'. 

有沒有辦法來檢查存儲過程是否有效或可以毫無問題地執行?提前

+0

除非您嘗試訪問它,否則驗證某件事似乎很難; ala通過執行存儲過程。爲什麼不執行來確定它是否有效? –

+1

這是因爲sql server有一個稱爲延遲名稱解析的功能。這意味着一個過程可以編譯,即使它引用了還不存在的對象。直到它需要生成一個執行計劃,這將是一個問題。 https://technet.microsoft.com/en-US/library/ms190686.aspx –

+0

我的主要問題是,我有一個很大的數據庫存儲過程。很多原因都是無效的(重命名列,刪除表等)。我試圖找到一種方法來驗證所有數據庫並檢查所有程序。 @AaronMcIver,我試過了,但有存儲過程接收參數。 – NioZero

回答

0

,你可以編寫腳本全部關閉使用任務存儲過程

謝謝 - >生成腳本功能。將所有腳本保存到單個文本文件中,然後創建解析器以編程方式解析文本並確定要檢查的對象。這將是非常困難的,甚至接近100%正確。我正在研究實際運行的函數和過程,但問題是,如果傳入的值導致代碼塊被跳過,那麼它不會驗證它們。

這可以驗證所有的意見,雖然

SELECT 
    'SELECT TOP 1 * FROM ' + obj.name + ' GO;' [SQL] 
FROM sys.objects obj 
WHERE obj.[TYPE] IN ('V') 

這是一個開始。

+0

這對存儲過程不起作用,如示例。 – NioZero

+0

這將如何幫助?他們仍然會編譯得很好。 –

+0

改變檢查對象和列我認爲...現在重新檢查 – UnhandledExcepSean

0

這是一個體面的起點找到缺少對象引用的程序,視圖等。

select * 
from sys.sql_expression_dependencies 
where referenced_id is null 
    AND referenced_server_name is null --excludes link server missing items 
+0

缺少引用不僅是唯一的問題... – NioZero

+0

這不是一個完整的解決方案。注意我說缺少對象引用。正如你在評論中提到的,沒有一種方法可以找到所有這些問題。 –