Sql Server 2005 обработка ошибок - внутреннее исключение

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

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

4 голоса | спросил HAdes 18 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 18 Sep 2008 01:43:30 +0400 2008, 01:43:30

2 ответа


0

Лучший способ справиться с этим - использовать параметры 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>

Enjoy

ответил Josef 3 +04002008-10-03T15:13:19+04:00312008bEurope/MoscowFri, 03 Oct 2008 15:13:19 +0400 2008, 15:13:19
0

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

ответил Daniel 18 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 18 Sep 2008 04:36:11 +0400 2008, 04:36:11

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132