Как получить внутренние ошибки из предложения try / catch в SQL Server - PullRequest
4 голосов
/ 02 августа 2011

Я выполняю хранимую процедуру в SQL Server 2008 внутри try / catch.Хранимая процедура и хранимые процедуры, которые она вызывает, вызывают несколько ошибок, но в режиме try / catch вы получаете только последнюю ошибку из хранимой процедуры, которую вы используете.

Есть ли способ / способ, позволяющий каким-то образом перехватить ВСЕ ошибки, сгенерированные дочерними хранимыми вызовами proc при выполнении определенной хранимой процедуры?(предположим, что у вас нет доступа к каким-либо хранимым процедурам, поэтому вы не можете изменить, где они могут записать ошибку, т. е. вы не можете просто изменить все хранимые процедуры, чтобы прекратить возникать ошибки, и вместо этого записать их в какую-то таблицу и в свой уловчитать из этой таблицы)

Ответы [ 3 ]

3 голосов
/ 02 августа 2011

Вот хороший ресурс о том, как бороться с ошибками в SQL Server.http://www.sqlservercentral.com/articles/Development/anerrorhandlingtemplatefor2005/2295/

Однако некоторые методы требуют, чтобы у вас была возможность изменить код, чтобы зафиксировать ошибки.Там действительно нет способа обойти это.Вы не можете просто проигнорировать ошибку, продолжить обработку, а затем вернуться позже, чтобы устранить ошибку.В большинстве, если не во всех языках, исключения должны рассматриваться во время возникновения исключения.T-SQL ничем не отличается.

Я лично использую хранимую процедуру для записи любой ошибки, когда она возникает.Вот что я использую:

CREATE PROCEDURE [dbo].[Error_Handler]
@returnMessage bit = 'False'
WITH EXEC AS CALLER
AS
BEGIN

  INSERT INTO Errors (Number,Severity,State,[Procedure],Line,[Message])
  VALUES (
    ERROR_NUMBER(),
    ERROR_SEVERITY(),
    ERROR_STATE(),
    isnull(ERROR_PROCEDURE(),'Ad-Hoc Query'),
    isnull(ERROR_LINE(),0),
    ERROR_MESSAGE())

  IF(@returnMessage = 'True')
  BEGIN
    select Number,Severity,State,[Procedure],Line,[Message]
    from Errors
    where ErrorID = scope_identity()
  END
END
1 голос
/ 02 августа 2011

У вас не будет методов Java или c #, вызывающих ошибку за ошибкой. Почему вы ожидаете, что SQL позволит это? Исключение есть исключение

Если ядро ​​БД выдает ошибки, у вас проблемы.

То, что я сделал раньше, это разделил тестирование и проверку кода: сначала выясни, что такое wronf, и сгенерируй одно исключение. Если ошибок нет, делай свои записи.

1 голос
/ 02 августа 2011

Если вы сохранили процы, которые вызывают более одной ошибки, их необходимо заменить, несмотря ни на что. Возможно, в вашей базе данных есть ошибки целостности данных. Это очень важно, «все должно остановиться прямо сейчас, пока это не будет исправлено». Если вы не можете заменить их, и они были неправильно написаны, чтобы продолжить обработку при достижении ошибки, то я не знаю способа найти ошибки. Ошибки не записываются, если вы не скажете им записываться. Если хранимые процедуры принадлежат продукту, который вы купили у другого поставщика, и поэтому вы не можете их поменять, лучше всего перейти на поставщика, который действительно понимает, как программировать код базы данных, потому что не удается спасти плохо написанный продукт .

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