начните пытаться поймать на SQL Server 2005, как отправить ERROR_stuff для вызывающего родителя? - PullRequest
0 голосов
/ 27 ноября 2009

у вас есть эта процедура

    CREATE PROCEDURE dbo.test1
    AS
    BEGIN
        begin transaction
        begin try
          exec dbo.test2
          commit transaction
        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
           rollback transaction
        end catch
    END

и этот

    CREATE PROCEDURE dbo.test2
    AS
    BEGIN
        begin transaction
        begin try

          commit transaction
        end try
        begin catch
           rollback transaction
            if @@trancount = 0
            begin
                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
             else
                --return the select above to the parent while raising an error
        end catch
    END

как сделать заново выбрасывать ошибку вызывающему родителю?

Я знаю, что могу сделать это;

  raiserror(ERROR_MESSAGE(),ERROR_SEVERITY(),ERROR_STATE())

но как получить ERROR_LINE () , ERROR_PROCEDURE () и ERROR_NUMBER () ?

Мне нужно иметь возможность делать один и тот же выбор в каждом улове, если это возможно

Ответы [ 2 ]

0 голосов
/ 27 ноября 2009

Мы используем сохраненный процесс (был udf, но добавлен журнал исключений), который мы вызываем в каждом блоке catch, чтобы объединить то, что нам нужно, и снова RAISERROR.

Вызываемый хранимый proc снова вызывает proc обработчика ошибок и добавляет дополнительную информацию и т. Д.

Функции ERROR_xxx () доступны в proc обработчика ошибок, потому что они находятся в области действия блока catch.

В конце концов, клиент (в нашем случае c #) получает исключение.

0 голосов
/ 27 ноября 2009

используйте raiserror в вашем ребенке.

...