Sql Server 2005 обработка ошибок - внутреннее исключение - PullRequest
4 голосов
/ 18 сентября 2008

В C # вы можете получить исходную ошибку и проследить путь выполнения (трассировка стека), используя переданное внутреннее исключение. Я хотел бы знать, как это может быть достигнуто с помощью обработки ошибок try / catch в SQL Server 2005, когда возникает ошибка в хранимой процедуре, вложенной в 2 или 3 уровня.

Я надеюсь, что такие функции, как ERROR_MESSAGE (), ERROR_LINE (), ERROR_PROCEDURE (), ERROR_SEVERITY () могут быть легко переданы по строке, чтобы хранимый процесс верхнего уровня мог получить к ним доступ.

Ответы [ 2 ]

4 голосов
/ 03 октября 2008

Лучший способ справиться с этим - использовать параметры OUTPUT и XML. Пример кода ниже покажет, как и как вы можете изменить то, что вы делаете с XML в TopProcedure, чтобы лучше обрабатывать ваш ответ на ошибку.

USE tempdb
go
CREATE PROCEDURE SubProcedure @RandomNumber int, @XMLErrors XML OUTPUT
AS
BEGIN
BEGIN TRY
    IF @RandomNumber > 50
        RaisError('Bad number set!',16,1)
    else
        select @RandomNumber
END TRY
BEGIN CATCH
    SET @XMLErrors = (SELECT * FROM (SELECT ERROR_MESSAGE() ErrorMessage, 
        ERROR_LINE() ErrorLine, ERROR_PROCEDURE() ErrorProcedure, 
        ERROR_SEVERITY() ErrorSeverity) a FOR XML AUTO, ELEMENTS, ROOT('root'))
END CATCH
END
go

CREATE PROCEDURE TopProcedure @RandomNumber int
AS
BEGIN
    declare @XMLErrors XML
    exec SubProcedure @RandomNumber, @XMLErrors OUTPUT
    IF @XMLErrors IS NOT NULL
        select @XMLErrors
END

go
exec TopProcedure 25
go
exec TopProcedure 55
go
DROP PROCEDURE TopProcedure
GO
DROP PROCEDURE SubProcedure
GO

Первоначальный вызов TopProcedure вернет 25. Второй вернет блок XML, который выглядит следующим образом:

<root>
  <a>
    <ErrorMessage>Bad number set!</ErrorMessage>
    <ErrorLine>6</ErrorLine>
    <ErrorProcedure>SubProcedure</ErrorProcedure>
    <ErrorSeverity>16</ErrorSeverity>
  </a>
</root>

Наслаждайтесь

0 голосов
/ 18 сентября 2008

Один из способов сделать это - создать таблицу в памяти и вставить в нее строки при обнаружении исключения. Затем вы повторно вызовете исключение, и следующая функция в цепочке будет иметь возможность обработать исключение или также записать исключение в таблицу в памяти. Это неприятно, но, к сожалению, нет способа получить стек вызовов T-SQL: (

...