2008-12-10 161 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