2013-07-15 33 views
1

我有一個存儲過程,每晚將由windows任務schedular執行。我只需要知道關於存儲過程執行的以下三件事情:
1.是由任務調度執行的存儲過程?
2.存儲過程是否執行但有錯誤?
3.存儲過程是否成功執行?如何將存儲過程的輸出保存到日誌表中?

我已經創建了一個表格來存放這些信息。該表有兩個字段:日期時間和說明。

在我的存儲過程結束時,我寫了一個插入語句,爲每次運行插入一條記錄到我的表(見下面的代碼)。但我需要定義兩個插入(見上面的項目2和3),3(成功)或2(有錯誤)。編號1是sp未執行時,因此沒有記錄插入表中。我已經使用了下面的語句,但它不起作用,因爲在插入表之前遇到錯誤時,存儲過程停止,所以插入從不發生。

IF @@ROWCOUNT > 0 and @@ERROR = 0 
BEGIN 
insert into Table1 
select GETDATE(), 'Successfully' 
END 

ELSE 
insert into Table1 
select GETDATE(), 'With errors' 

您是否知道解決此問題的好方法?我可以使用哪些語句來保存該表格的記錄?

我正在使用SQL server 2005.

P.S.這些數據將顯示在報告中:我將編寫一個查詢,該查詢必須返回表中的數據+日期和表中不存在的日期。

回答

2

你的程序應該有一個TRY/CATCH實現

http://msdn.microsoft.com/en-us/library/ms175976(v=sql.90).aspx

包住整個程序邏輯中BEGIN TRY ... END TRY和使用您的CATCH塊在日誌表中寫入錯誤。成功的日誌寫在TRY塊的末尾。

如果您需要處理任何自定義錯誤檢查並從程序中的任何位置跳轉到CATCH塊,您還可以與RAISERROR結合使用。

SQLFiddle DEMO

+0

當Try塊發生錯誤時,存儲過程不會繼續到catch塊,我是對吧?我在這裏談論插入失敗像重複鍵錯誤等。 – Amedo

+0

你是不對的。如果Try塊中發生錯誤 - 存儲過程將轉到catch塊(除非發生嚴重的系統錯誤)。這正是它存在的原因。 這裏是一個演示 - http://sqlfiddle.com/#!6/6ba46/1 –

+0

我在查詢窗口中測試它,而不是存儲過程。我認爲測試它作爲查詢是問題。你能告訴try catch塊能處理哪種類型的錯誤嗎?系統錯誤下我能理解什麼? – Amedo

0

您可以使用管理任務計劃程序在特定時間執行存儲過程。您必須先爲存儲過程執行定義一個任務。然後,當存儲過程運行時發生指定時間或事件時,管理任務調度程序將調用存儲過程。

具體地,管理任務調度器執行以下操作:

管理任務調度程序連接到在任務參數DB2SSID指定的DB2®構件。如果管理任務調度程序無法建立連接,則會跳過存儲過程的執行並將最後一個執行狀態設置爲NOTRUN狀態。 管理任務調度程序使用任務參數過程輸入中定義的SELECT語句從DB2檢索存儲過程的參數值。如果管理任務調度程序檢索這些參數值時發生錯誤,則管理任務調度程序: 不調用存儲過程。 將任務的上次執行狀態設置爲由DB2返回的錯誤代碼。 管理任務調度程序使用檢索到的參數值和存儲過程名稱發出SQL CALL語句。過程名稱從任務參數過程模式和過程名稱連接起來。 SQL CALL語句是同步的,執行線程被阻塞直到存儲過程完成執行。管理任務調度程序將最後的執行狀態設置爲由DB2返回的值。 管理任務調度程序發出COMMIT語句。 管理任務調度程序關閉到DB2的連接。

+0

謝謝你的評論。由於具有此報告的用戶,我無法使用另一種方法。 – Amedo