@@ ОШИБКА и/или ПОПЫТКА - ВЫГОДА

Ленивая Загрузка код Вам нужно по требованию. Google делает что-то вроде этого с их google.loader

15
задан marc_s 14 February 2010 в 10:55
поделиться

6 ответов

Эрланд Соммарског, MVP SQL Server должен прочитать следующую статью: Реализация обработки ошибок с помощью хранимых процедур

Также обратите внимание, что Ваш блок TRY может дать сбой, и ваш блок CATCH может быть пропущен

Еще одна вещь: хранимые процедуры, использующие обработку ошибок старого стиля и точки сохранения, могут не работать должным образом, когда они используются вместе с блоками TRY… CATCH. Избегайте смешивания старого и нового стилей ошибок

14
ответ дан 1 December 2019 в 02:46
поделиться

Try Catch не перехватит все

вот код, демонстрирующий, что

    BEGIN TRY
      BEGIN TRANSACTION TranA
     DECLARE  @cond INT;
     SET @cond =  'A';
    END TRY
    BEGIN CATCH
     PRINT 'a'
    END CATCH;
    COMMIT TRAN TranA

Сервер: Msg 3930, уровень 16, состояние 1, строка 9 Текущая транзакция не может быть зафиксирована и не может поддерживать операции записи в файл журнала. Откатить транзакцию. Сервер: Msg 3998, уровень 16, состояние 1, строка 1 Незавершенная транзакция обнаруживается в конце пакета. Выполнен откат транзакции.

4
ответ дан 1 December 2019 в 02:46
поделиться

По моему опыту, согласно электронной документации блоки TRY ... CATCH будут перехватывать все события, которые могут вызвать ошибки (и, таким образом, установить @@ ERROR на ненулевое значение ценность). Я не могу придумать ни одного обстоятельства, при котором это не применимо. Так что нет, возвращаемое значение никогда не будет равно 1111, и было бы нецелесообразно включать эту проверку ошибок @@.

Однако обработка ошибок может быть очень критичной, и я бы хеджировал свои ставки на такие крайние ситуации, как как DTC, связанные серверы, службы уведомлений или брокерские услуги, а также другие функции SQL, с которыми я имел очень мало опыта. Если можете, проверьте свои более причудливые ситуации, чтобы увидеть, что на самом деле произойдет.

0
ответ дан 1 December 2019 в 02:46
поделиться

The whole point of "Try..Catch" is so that you don't have to check for @@ERROR for every statement.

So it's not worthwhile.

0
ответ дан 1 December 2019 в 02:46
поделиться

TRY / CATCH перехватывает больше. Это намного и удивительно лучше.

DECLARE @foo int

SET @foo = 'bob' --batch aborting pre-SQL 2005
SELECT @@ERROR
GO
SELECT @@ERROR  --detects 245. But not much use, really if the batch was a stored proc
GO


DECLARE @foo int
BEGIN TRY
    SET @foo = 'bob'
    SELECT @@ERROR
END TRY
BEGIN CATCH
    SELECT ERROR_MESSAGE(), ERROR_NUMBER()
END CATCH
GO

Использование TRY / CATCH в триггерах также работает. Откат триггера раньше тоже был пакетным прерыванием: больше не будет, если TRY / CATCH также используется в триггере.

Ваш пример будет лучше, если BEGIN / ROLLBACK / COMMIT находится внутри, а не снаружи конструкции

8
ответ дан 1 December 2019 в 02:46
поделиться

Я не верю, что управление когда-либо достигнет оператора RETURN - как только вы находитесь в блоке TRY, любая возникшая ошибка передаст управление блоку CATCH. Однако есть некоторые очень серьезные ошибки, которые могут привести к прерыванию пакета или даже самого соединения (Эрланд Соммарског написал на тему ошибок в SQL Server здесь и здесь - к сожалению, он не обновил их, чтобы включить TRY ... CATCH). Я не уверен, что вы сможете ПОЛУЧИТЬ подобные ошибки, но тогда @@ ERROR тоже не годится.

0
ответ дан 1 December 2019 в 02:46
поделиться
Другие вопросы по тегам:

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