1
因此,我們有多個存儲過程在早晨SQL作業中使用,並且按順序調用過程。如果proc中的某個查詢失敗,我們會爲每個查詢執行一次錯誤捕獲/日誌記錄,以便我們確切知道哪個部分失敗。但問題是,如果某些失敗,這些過程中的一些很難重新開始,所以我正考慮在每個存儲過程中實現一個TRANSACTION
。帶有多個更新的SQL Server事務,插入
目前的程序與此類似:
CREATE PROCEDURE [dbo].[spStep01]
(
@Return_Message Varchar(1024) OUT -- Error messages returned to the calling program
)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @ErrorCode int
DECLARE @ApplicationNumber int
DECLARE @TaskNumber int
DECLARE @TaskCompleted smallint
DECLARE @TaskFailed smallint
DECLARE @TaskRunning smallint
DECLARE @ErrorSeverity smallint
DECLARE @ErrorState smallint
SELECT @ErrorCode = @@ERROR
SELECT @ApplicationNumber = 10
SELECT @TaskNumber = 1
SELECT @TaskCompleted = 0
SELECT @TaskFailed = -1
SELECT @TaskRunning = 1
SELECT @ErrorSeverity = 16
SELECT @ErrorState = 1
/***************************************************************************
* first insert
***************************************************************************/
BEGIN TRY
INSERT INTO ...
END TRY
BEGIN CATCH
SELECT @Return_Message = 'FAILED - first insert did not populate'
EXEC dbo.spTrackTask '', @ApplicationNumber, @TaskNumber, @TaskFailed, @Return_Message
RAISERROR (@Return_Message, @ErrorSeverity, @ErrorState)
RETURN
END CATCH
/***************************************************************************
* second insert
***************************************************************************/
BEGIN TRY
INSERT INTO ...
END TRY
BEGIN CATCH
SELECT @Return_Message = 'FAILED - second insert did not populate'
EXEC dbo.spTrackTask '', @ApplicationNumber, @TaskNumber, @TaskFailed, @Return_Message
RAISERROR (@Return_Message, @ErrorSeverity, @ErrorState)
RETURN
END CATCH
/***************************************************************************
* Procedure has completed successfully
***************************************************************************/
SELECT @Return_Message = 'SUCCESS - Inserts were complete'
EXEC dbo.spTrackTask '', @ApplicationNumber, @TaskNumber, @TaskCompleted, @Return_Message
/*************************************
* Get the Error Message for @@Error
*************************************/
IF @ErrorCode <> 0
BEGIN
SELECT @Return_Message = [Description] -- Return the SQL Server error
FROM master.dbo.SYSMESSAGES
WHERE error = @ErrorCode
END
/*************************************
* Return from the Stored Procedure
*************************************/
RETURN @ErrorCode -- =0 if success, <>0 if failure
END
我試圖確定的是,如果我換行所有TRY/CATCH
塊的一個TRANSACTION
,如果將回滾一切將引發一個錯誤。我環顧四周,發現一個TRY/CATCH
塊的examples,但是我們在大多數存儲過程中會有多個。我沒有太多的交易經驗,所以我不能100%確定如何在這種情況下正確實施它。
將包裝在TRANSACTION
工作?還是有更好的方法來做到這一點?