В этом случае ваш «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