После получения дополнительной информации в вашем комментарии проблема возникает из-за того, что это не поддающаяся обнаружению ошибка.
Не удалось выполнить синтаксический анализ первого пакета из-за несуществующего объекта, поэтому не удалось выполнить весь пакет (включая оператор raiserror
).
для упрощенного примера
SELECT * FROM NonExistentTable
GO
SELECT 1 AS [SecondBatch]
Возвращает
Msg 208, Level 16, State 1, Line 3
Invalid object name 'NonExistentTable'.
SecondBatch
-----------
1
Пара способов обойти это - поместить каждый пакет в дочернюю область, используя динамический SQL
BEGIN TRY
EXEC('SELECT * FROM NonExistentTable')
END TRY
BEGIN CATCH
RAISERROR('Oh no a fatal error', 20, -1) WITH LOG
END CATCH
EXEC('SELECT 1 AS [SecondBatch]')
Возвращает
Msg 2745, Level 16, State 2, Line 5
Process ID 55 has raised user error 50000, severity 20. SQL Server is terminating this process.
Msg 50000, Level 20, State 1, Line 5
Oh no a fatal error
Msg 0, Level 20, State 0, Line 0
A severe error occurred on the current command. The results, if any, should be discarded.
Или (поскольку переменные будут выходить за рамки между партиями), вы можете SET CONTEXT_INFO
в конце каждого пакета и затем проверить это в начале следующего пакета.
BEGIN TRY
SELECT * FROM NonExistentTable
SET CONTEXT_INFO 1
END TRY
BEGIN CATCH
END CATCH
GO
IF CONTEXT_INFO() <> 1
RETURN
BEGIN TRY
SELECT 1 AS [SecondBatch]
SET CONTEXT_INFO 2
END TRY
BEGIN CATCH
END CATCH
GO
IF CONTEXT_INFO() <> 2
RETURN
BEGIN TRY
SELECT 1 AS [ThirdBatch]
SET CONTEXT_INFO 3
END TRY
BEGIN CATCH
END CATCH