使用try / catch进行更新

时间:2008-12-10 19:11:31

标签: sql sql-server sql-server-2005

因为我是新手,我试图注销我写的存储过程可能出现的任何错误。我理解SQL 2005中的Try / Catch和error_procedure(),ERROR_MESSAGE()以及其他内置函数。我无法弄清楚如何做的是捕获在更新时导致错误的记录。

我可以使用游标并循环并一次更新一行。然后在循环中设置一个值并报告该值。但这似乎打败了使用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 个答案:

答案 0 :(得分: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 代码中找到问题。如果这是在存储过程中,您还可以返回参数(即将SELECT @RecordID AS [RecordID]添加到catch块中的该列表)。尽管如此,如果您遇到实际数据的问题,我建议您考虑添加外键和其他约束来保护数据库的逻辑完整性。理想情况下,您至少不能将数据放入数据库中,这会破坏您的存储过程。

修改

如果您将UPDATE置于存储过程中并捕获错误,请参阅您最近的编辑内容,然后使用对该过程的调用替换您的更新系列,其余更新将继续,您可以返回/跟踪/记录但是你希望在SP的catch块中出现错误。

答案 1 :(得分:-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