2

我有一個(SQL 2005)存儲過程,它處理一個巨大的表並將過去的數據(直到一年前)分組。它有這個主要步驟:分組到新表帶有日誌記錄和錯誤處理的SQL Server 2005存儲過程

  • 複製舊的數據
  • 複製近期數據是新表
  • 重命名錶

現在我想記錄每一次運行並記錄日誌表中的每一步。不過,我從一開始就開始一個事務,這樣如果出現問題,我可以回滾整個批處理。但是,這也會回滾我的日誌,這不是我想要的。

我該如何解決這個問題?

回答

1

記錄到一個表變量,因爲這不會回滾事務,然後在過程結束後,在提交或回滾之後,將表變量的內容插入到永久記錄表中。

+0

會帶來一些進一步的步驟,但不是有致命的錯誤,可以關閉整個過程,讓我不能控制堅持日誌表變量? – Koen

+0

@Koen - 如果你需要迎合這個(例如高嚴重錯誤終止連接),我只能建議記錄事件日誌或跟蹤(使用[用戶可配置的SQL Server Profiler事件](http:///weblogs.sqlteam.com/mladenp/archive/2008/10/16/Custom-user-configurable-SQL-Server-Profiler-events.aspx)) –

1
  • 使用SET XACT_ABORT ON強制回滾
  • 要捕獲所有的錯誤(如代碼運行),使用try/catch塊。

然後,您可以簡單地記錄您的CATCH塊中的錯誤。這裏

例(可以添加自己的日誌記錄):Nested stored procedures containing TRY CATCH ROLLBACK pattern?

就個人而言,我覺得這比使用表變量更優雅。

+0

不知道這是否會工作(或我沒有得到這個完全)。我也想記錄關於每個步驟(和持續時間)的信息消息到日誌表。然後,我還可以追蹤錯誤發生的最後一個成功步驟。你有數過嗎? – Koen

+0

@Koen:是的,你可以使用在CATCH塊 – gbn

+0

中讀取的每個語句之前設置的2個變量。現在我想知道爲什麼有人-1編輯此回覆因爲我剛剛實現了兩個答案的組合。 .. – Koen