Всем добрый день!
Ситуация следующая.
Есть 3 sql-скрипта, которые последовательно запускаются в батнике.
В первом из них - создание таблицы (например: CREATE TABLE xxx(id int))
Во втором - любое неправильное действие (например: SELECT 1/0), обрамленное конструкцией TRY...CATCH.
То есть что-то вроде
BEGIN TRY
SELECT 1/0
END TRY
BEGIN CATCH
ROLLBACK
;throw 50000, 'AZAZAZ', 1
END CATCH
В третьем - какие-то действия с таблицей. Например, добавление в нее данных (INSERT INTO xxx (id) VALUES (1))
Суть: при запуске батника падает ошибка, но не в блоке #2! А в последнем (#3). Со словами "таблицы xxx не существует".
Получается, exception в блоке #2 не отработал. А было отработано по следующей схеме:
- из-за ошибки в блоке #2 было отменено все, что было сделано в блоке #1
- ошибка в блоке #2 не была поймана TRY...CATCH
- когда пришло время блока #3, первых 2 блоков как будто и не было.
Я добавлял/убирал в блок #2 set xact_abort on и commit/rollback, но эффект тот же самый.
Вопрос команде знатоков: можно ли как-то заставить TRY...CATCH работать и вызывать ошибку на этапе второго блока (чтобы валилось, не доходя до третьего)?
Ситуация следующая.
Есть 3 sql-скрипта, которые последовательно запускаются в батнике.
В первом из них - создание таблицы (например: CREATE TABLE xxx(id int))
Во втором - любое неправильное действие (например: SELECT 1/0), обрамленное конструкцией TRY...CATCH.
То есть что-то вроде
BEGIN TRY
SELECT 1/0
END TRY
BEGIN CATCH
ROLLBACK
;throw 50000, 'AZAZAZ', 1
END CATCH
В третьем - какие-то действия с таблицей. Например, добавление в нее данных (INSERT INTO xxx (id) VALUES (1))
Суть: при запуске батника падает ошибка, но не в блоке #2! А в последнем (#3). Со словами "таблицы xxx не существует".
Получается, exception в блоке #2 не отработал. А было отработано по следующей схеме:
- из-за ошибки в блоке #2 было отменено все, что было сделано в блоке #1
- ошибка в блоке #2 не была поймана TRY...CATCH
- когда пришло время блока #3, первых 2 блоков как будто и не было.
Я добавлял/убирал в блок #2 set xact_abort on и commit/rollback, но эффект тот же самый.
Вопрос команде знатоков: можно ли как-то заставить TRY...CATCH работать и вызывать ошибку на этапе второго блока (чтобы валилось, не доходя до третьего)?