2008-12-10 100 views
3

因爲我是新手我想退出與我編寫存儲過程中可能出現的任何錯誤。我理解SQL 2005中的Try/Catch和error_procedure(),ERROR_MESSAGE()以及其他內置函數。我無法弄清楚如何做的是捕獲什麼記錄導致更新錯誤。使用try/catch語句進行更新

我大概可以使用一個遊標循環並同時更新一行。然後在循環中設置一個值並報告該值。但是這似乎破壞了使用SQL的目的。

在哪裏研究這個問題,不勝感激任何意見或指針。我不完全理解RowNumber()能以某種方式使用它嗎?在這裏抓秸稈。

歡呼聲和感謝

鮑勃

我使用SQL 2005

編輯

我真的不希望使用交易對於大多數的這一點,因爲它僅僅是報告目的。所以我正在做的一個例子是:

/****************************************************************************** 
    Now get update the table with the current worker. That depends on the 
    current status of the loan. 
******************************************************************************/ 

UPDATE #table SET currWorker = tblUser.UserLogonName 
     FROM tblUser 
      JOIN tblLoanInvolvement ON tblLoanInvolvement.invlUnderwriterDeptID = tblUser.userID 
      WHERE tblLoanInvolvement.LOANid = #table.loanid 
      AND #table.currstatus in('R_UW_Approved','R_Submitted to Underwriting') 


    UPDATE #table SET currWorker = tblUser.UserLogonName 
    FROM tblUser 
     JOIN tblLoanInvolvement ON tblLoanInvolvement.invlProcessorID = tblUser.userID 
     WHERE tblLoanInvolvement.LOANid = #table.loanid 
     AND #table.currstatus in('R_UW Approved With Conditions','R_Loan Resubmitted','R_UW_Suspended','R_Submitted to Processing') 

    UPDATE #table SET currWorker = tblUser.UserLogonName 
    FROM tblUser 
     JOIN tblLoanInvolvement ON tblLoanInvolvement.invlCloserID = tblUser.userID 
     WHERE tblLoanInvolvement.LOANid = #table.loanid 
     AND #table.currstatus in('R_Docs Out','R_Ready to Close','R_Scheduled to Close and Fund','Scheduled To Close') 

所以如果一行沒有正確更新,我不想失去整個事情。但是知道導致問題的#table.loanid的價值將非常方便。

謝謝你的時間。

回答

2

一個try/catch塊這樣的...

BEGIN TRY 
    -- Your Code Goes Here -- 
END TRY 
BEGIN CATCH 
    SELECT 
     ERROR_NUMBER() AS ErrorNumber, 
     ERROR_SEVERITY() AS ErrorSeverity, 
     ERROR_STATE() AS ErrorState, 
     ERROR_PROCEDURE() AS ErrorProcedure, 
     ERROR_LINE() AS ErrorLine, 
     ERROR_MESSAGE() AS ErrorMessage 
END CATCH 

...將幫助你在你的SQL代碼定位問題。如果這是在一個存儲過程中,你也可以返回參數(即在catch塊中添加一個SELECT @RecordID AS [RecordID]到該列表中)。繼續前進,如果您遇到實際數據的問題,我鼓勵您查看添加外鍵和其他限制條件來保護數據庫的邏輯完整性。理想情況下,您至少不能將數據放入數據庫,這會破壞存儲過程。

編輯

指的你最近的修改,如果你把UPDATE存儲過程中,趕上錯誤,然後調用該程序剩餘的更新將繼續更換您的更新系列,和你無論你希望如何,都可以返回/跟蹤/記錄SP的catch塊中的錯誤。

+0

謝謝Paul,我想我會這麼做的。我很難第一次描述這個問題,再次感謝您的回覆。 – 2008-12-10 21:39:13

-1

替代:怎麼樣使用事務和@@ IDENTITY?

DECLARE @problemClientID INT 
BEGIN TRANSACTION 

    UPDATE ... --etc 

    IF @@ERROR <> 0 
    BEGIN 
     ROLLBACK TRANSACTION 
     SET @problemClientID = @@IDENTITY 
     PRINT N'There was a problem...' --etc 
    END 
    ELSE 
    BEGIN 
     -- transaction was a success, do more stuff? 
    END 
COMMIT TRANSACTION 
+0

@@身份幾乎總是插入(如果你把一個觸發器onthe表插入到一個不同的充表的身份,將給出錯誤的值)一個不錯的選擇。並且不能用於獲取更新的記錄,因爲它只顯示最後插入的身份值而不是最後更新的值。 – HLGEM 2008-12-10 21:13:43