因为我是新手,我试图注销我写的存储过程可能出现的任何错误。我理解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的价值会非常方便。
感谢您的时间。
答案 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