Использование try / catch для обновления - PullRequest
3 голосов
/ 10 декабря 2008

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

Спасибо за ваше время.

Ответы [ 2 ]

2 голосов
/ 10 декабря 2008

Блок 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). Однако, если двигаться дальше, если у вас возникнут проблемы с фактическими данными, я бы посоветовал вам взглянуть на добавление внешних ключей и других ограничений для защиты логической целостности вашей базы данных. В идеале, как минимум, вы не можете поместить данные в базу данных, что нарушит ваши хранимые процедуры.

EDIT

Ссылаясь на последние изменения, если вы поместите ОБНОВЛЕНИЕ в хранимую процедуру и поймаете ошибку, а затем замените серию обновлений вызовами этой процедуры, остальные обновления продолжатся, и вы сможете вернуться / отслеживать / регистрировать ошибка в блоке захвата SP, однако вы хотели.

0 голосов
/ 10 декабря 2008

Альтернатива: как насчет использования транзакций и @@ 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...