Поскольку я новичок, я пытаюсь выйти из системы с любыми ошибками, которые могут возникнуть с хранимыми процедурами, которые я пишу. Я понимаю Try / Catch в SQL 2005 и 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, вызвавшего проблему.
Спасибо за ваше время.


Альтернатива: как насчет транзакций и @@ 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
Такой блок 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). Однако в дальнейшем, если вы столкнетесь с проблемами с фактическими данными, я бы посоветовал вам взглянуть на добавление внешних ключей и других ограничений для защиты логической целостности вашей базы данных. В идеале, как минимум, вы не можете помещать данные в базу данных, что нарушит ваши хранимые процедуры.
РЕДАКТИРОВАТЬ
Ссылаясь на ваши самые последние изменения, если вы поместите ОБНОВЛЕНИЕ внутри хранимой процедуры и поймаете ошибку, а затем замените серию обновлений вызовами этой процедуры, оставшиеся обновления будут продолжены, и вы можете вернуть / отслеживать / регистрировать ошибку в блок захвата SP, как бы вы ни хотели.
Спасибо, Пол, думаю, я это сделаю. Мне сложно описать проблему в первый раз, еще раз спасибо за повторную проверку.
@@ Identity - почти всегда плохой выбор для вставок (он даст неправильное значение, если вы поместите триггер в таблицу, которая вставляется в другую таблицу с идентификатором). И вообще не может использоваться для обновления записи, поскольку показывает только последнее вставленное значение идентификатора, а не последнее обновленное значение.