Проблема обработки пакетных ошибок SQL Server - PullRequest
1 голос
/ 21 марта 2009

Как мне получить этот пакет SQL, чтобы в конце получить часть транзакции RollBack? SQL просто останавливает выполнение скрипта на неправильной строке кода. Я знаю, что могу использовать конструкцию try / catch, но меня больше интересует, как это было обработано до того, как SQL добавил try / catch.

BEGIN TRAN

CREATE TABLE TempTable (c1 INT NULL)

INSERT INTO TempTable (c1) SELECT 1

INSERT INTO TempTable (c1) SELECT 'ABS'

IF (@@ERROR = 0) 
BEGIN
    PRINT 'no error'
    COMMIT TRAN
END
    ELSE
BEGIN
    PRINT 'error' -- Why does it never get here???????
    ROLLBACK TRAN
END

1 Ответ

8 голосов
/ 21 марта 2009

В этом случае ваш «ABS» прерывается, потому что это ошибка CAST. Объяснение здесь, в Отличная статья Эрланда Соммарского

Вы должны прочитать эту статью. Больше, чем когда-либо нужно было знать об обработке ошибок SQL.

Кроме того, вы должны проверить каждое утверждение. Если первая INSERT не удалась, вы все равно продолжите выполнение (если только у вас не было XACT_ABORT ON.

BEGIN TRAN

CREATE TABLE TempTable (c1 INT NULL)

INSERT INTO TempTable (c1) SELECT 1
IF @@ERROR <> 0
    GOTO errhandler

INSERT INTO TempTable (c1) SELECT 'ABS'
IF @@ERROR <> 0
    GOTO errhandler

PRINT 'no error'
COMMIT TRAN
GOTO exitpoint

errhandler:
PRINT 'error' -- Why does it never get here???????
ROLLBACK TRAN

exitpoint:

Если у вас SQL Server 2000, тогда у вас не так много вариантов, кроме добавления дополнительных проверок, ISNUMERIC и т. Д.

Если у вас SQL Server 2005, вам действительно следует использовать новые методы. Практически все ошибки кода и выполнения ловятся без ошибок.

BEGIN TRY
    BEGIN TRAN

    CREATE TABLE TempTable (c1 INT NULL)

    INSERT INTO TempTable (c1) SELECT 1

    INSERT INTO TempTable (c1) SELECT 'ABS'

    PRINT 'no error'
    COMMIT TRAN
END TRY
BEGIN CATCH
    PRINT 'error' --It will get here for SQL 2005
    ROLLBACK TRAN
END CATCH
...