Как записать ошибку хранимой процедуры - PullRequest
4 голосов
/ 26 сентября 2008

Сценарий: Приложения C # используют SQL2000. Это исключение 3 хранимых процедур в попытке поймать в приложении. В подвохе ошибка подавлена. Из-за некоторых законностей код c # не может быть изменен и реализован.

Q: Как перехватить фактическую ошибку SQL в хранимом процессе в файле журнала или другой таблице? @@ Error возвращает сообщение об ошибке приложению, но при оценке в анализаторе запросов оно всегда равно 0, хотя «@ @ Error <> 0» срабатывает. Я пытаюсь сохранить номер ошибки @@, но это всегда 0.

Пожалуйста, помогите.

Ответы [ 4 ]

5 голосов
/ 26 сентября 2008

@@ERROR сбрасывается в 0 при проверке. Зачем? Потому что он отражает статус последнего выполненного оператора.

IF @@ERROR <> 0 ...

является оператором, и этот оператор успешно выполняется, в результате чего @@ERROR устанавливается на 0.

Правильный способ проверки и обработки значений @@ERROR заключается в следующем:

DECLARE @ErrorCode INT

INSERT INTO Table ...

SET @ErrorCode = @@ERROR
IF @ErrorCode <> 0
BEGIN
    INSERT INTO ErrorLog (ErrorCode, Message)
        VALUES (@ErrorCode, 'The INSERT operation failed.')
END
3 голосов
/ 26 сентября 2008

У вас нет примера, но посмотрите на использование

RAISERROR ... WITH LOG

см. http://msdn.microsoft.com/en-us/library/aa238452(SQL.80).aspx для получения дополнительной информации.

Или используйте:

xp_logevent {error_number, 'message'} [, 'severity']

для записи в журнал событий. Больше информации на http://msdn.microsoft.com/en-us/library/aa260695(SQL.80).aspx

1 голос
/ 03 мая 2011
ALTER PROCEDURE [dbo].[StoreProcedureName] 
(
parameters 
)
AS
BEGIN
    SET NOCOUNT On
    BEGIN TRY               
        --type your query   

    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
            RETURN -1
    END CATCH
End
1 голос
/ 26 сентября 2008

Сам не пробовал, но я думаю, вы можете отслеживать ошибки с помощью Sql Server Profiler .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...