Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Не работает блок TRY/CATCH (не ловятся ошибки) при запуске bat-файла  [new]
Кек2017
Member [заблокирован]

Откуда:
Сообщений: 9
Всем добрый день!

Ситуация следующая.
Есть 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 работать и вызывать ошибку на этапе второго блока (чтобы валилось, не доходя до третьего)?
9 янв 17, 17:49    [20085727]     Ответить | Цитировать Сообщить модератору
 Re: Не работает блок TRY/CATCH (не ловятся ошибки) при запуске bat-файла  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37225
Вы серьезно пытаетесь поймать ошибку компиляции батча в try/catch в этом же батче?
9 янв 17, 17:50    [20085731]     Ответить | Цитировать Сообщить модератору
 Re: Не работает блок TRY/CATCH (не ловятся ошибки) при запуске bat-файла  [new]
Konst_One
Member

Откуда:
Сообщений: 11600
https://technet.microsoft.com/ru-ru/library/ms179296(v=sql.105).aspx

См. Нефиксируемые транзакции
9 янв 17, 17:53    [20085736]     Ответить | Цитировать Сообщить модератору
 Re: Не работает блок TRY/CATCH (не ловятся ошибки) при запуске bat-файла  [new]
Кек2017
Member [заблокирован]

Откуда:
Сообщений: 9
Гавриленко Сергей Алексеевич,

Да. Мне нужно зафиксировать падение именно в блоке #2, не доходя до третьего.

Если запускать все 3 скрипта отдельно по очереди, то ошибка "благополучно" падает и ловится. Но это именно последовательный запуск сразу 3 скриптов (последовательно) в bat, и такое впечатление, что вся суть именно в этом. Если у Вас есть варианты, как "завалить" выполнение на 2 блоке - напишите, буду очень благодарен!
9 янв 17, 17:59    [20085757]     Ответить | Цитировать Сообщить модератору
 Re: Не работает блок TRY/CATCH (не ловятся ошибки) при запуске bat-файла  [new]
Кек2017
Member [заблокирован]

Откуда:
Сообщений: 9
Konst_One,

Кстати, что я заметил. Если в блоке #2 написать какую-либо заведомо неправильную команду вроде insert into xxx2(id) values(1), то свалится все-таки в блоке #2, с ошибкой вроде "таблицы xxx2 не существует"
9 янв 17, 18:03    [20085778]     Ответить | Цитировать Сообщить модератору
 Re: Не работает блок TRY/CATCH (не ловятся ошибки) при запуске bat-файла  [new]
Konst_One
Member

Откуда:
Сообщений: 11600
почитайте уже статейку внимательно,там есть про это
9 янв 17, 18:04    [20085784]     Ответить | Цитировать Сообщить модератору
 Re: Не работает блок TRY/CATCH (не ловятся ошибки) при запуске bat-файла  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31863
Кек2017
Суть: при запуске батника падает ошибка, но не в блоке #2! А в последнем (#3). Со словами "таблицы xxx не существует".
Получается, exception в блоке #2 не отработал. А было отработано по следующей схеме:
- из-за ошибки в блоке #2 было отменено все, что было сделано в блоке #1
- ошибка в блоке #2 не была поймана TRY...CATCH
- когда пришло время блока #3, первых 2 блоков как будто и не было.
Я добавлял/убирал в блок #2 set xact_abort on и commit/rollback, но эффект тот же самый.
Оно не падает "в последнем (#3)".
Сервер не выполняет ни одного блока из трёх.
Для наглядности, упрощённо - он сначала скрипт компилирует, и находит ошибки в коде, например, отсутствует переменная, таблица, неправильный синтаксис команды.
И вот если ошибок нет, то он начнёт последовательное выполнение этих "блоков".
9 янв 17, 18:07    [20085799]     Ответить | Цитировать Сообщить модератору
 Re: Не работает блок TRY/CATCH (не ловятся ошибки) при запуске bat-файла  [new]
Кек2017
Member [заблокирован]

Откуда:
Сообщений: 9
Konst_One,

Я добавлял проверку на XACT_STATE и пробовал откатить в CATCH'е транзакцию rollback'ом. Эффект тот же(

Если не трудно, приведите пример, как, на Ваш взгляд, можно было бы "вылечить" мою ситуацию.
9 янв 17, 18:24    [20085848]     Ответить | Цитировать Сообщить модератору
 Re: Не работает блок TRY/CATCH (не ловятся ошибки) при запуске bat-файла  [new]
Кек2017
Member [заблокирован]

Откуда:
Сообщений: 9
alexeyvg,

но ошибку же он выводит именно из третьего блока!

Как Вы думаете, можно ли, чтобы после общей компиляции (о которой Вы сказали), выводилось сообщение об ощибке именно из второго блока?
9 янв 17, 18:26    [20085853]     Ответить | Цитировать Сообщить модератору
 Re: Не работает блок TRY/CATCH (не ловятся ошибки) при запуске bat-файла  [new]
Кек2017
Member [заблокирован]

Откуда:
Сообщений: 9
Друзья, UPD!

Если в моей ситуации из блока #2 убрать абсолютно все BEGIN и ROLLBACK, то ошибки не падает вообще. И инструкции из блока #3 выполнятся в штатном порядке.

При том, что во втором блоке явная ошибка (деление на ноль). Как сделать так, чтобы на ней выполнение "свалилось"?
9 янв 17, 18:53    [20085940]     Ответить | Цитировать Сообщить модератору
 Re: Не работает блок TRY/CATCH (не ловятся ошибки) при запуске bat-файла  [new]
o-o
Guest
Кек2017
Если в моей ситуации из блока #2 убрать абсолютно все BEGIN и ROLLBACK

а что вы вообще собрались откатывать своим роллбэком?
у вас где-то открывается явная транзакция?
приведите весь код, а не огрызок
9 янв 17, 19:09    [20086002]     Ответить | Цитировать Сообщить модератору
 Re: Не работает блок TRY/CATCH (не ловятся ошибки) при запуске bat-файла  [new]
Кек2017
Member [заблокирован]

Откуда:
Сообщений: 9
o-o,

Файл#1.
CREATE TABLE xxx(id int)

Файл#2. (пусть будет без rollback'а)
BEGIN TRY
SELECT 1/0
END TRY
BEGIN CATCH
;throw 50000, 'AAA', 1
END CATCH

Файл#3.
INSERT INTO xxx (id) VALUES (1)

Все эти файлы запускаются одним батником.
На выходе имеем таблицу xxx, заполненную 1 строкой.

-----

Если файл #2 представить как, например
BEGIN TRY
BEGIN TRAN
INSERT INTO xxx (id) VALUES ('XYZ')
COMMIT TRAN
END TRY
BEGIN CATCH
ROLLBACK TRAN
;throw 50000, 'AAA', 1
END CATCH

то на выходе получим ошибку: "таблицы xxx не существует" (при попытке вставить туда 1)
9 янв 17, 19:22    [20086051]     Ответить | Цитировать Сообщить модератору
 Re: Не работает блок TRY/CATCH (не ловятся ошибки) при запуске bat-файла  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
rollback откатывает ВСЕ транзакции
9 янв 17, 19:32    [20086073]     Ответить | Цитировать Сообщить модератору
 Re: Не работает блок TRY/CATCH (не ловятся ошибки) при запуске bat-файла  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
Покажите, как вы запускаете скрипты? чем? как запускаются Бат-ники?
9 янв 17, 19:33    [20086075]     Ответить | Цитировать Сообщить модератору
 Re: Не работает блок TRY/CATCH (не ловятся ошибки) при запуске bat-файла  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37225
Вы не поймаете ошибку компиляции в try в этом батче. Хотите ловить и подменять "некрасивую" ошибку на вашу -- оборачивайте еще одним.
9 янв 17, 19:38    [20086091]     Ответить | Цитировать Сообщить модератору
 Re: Не работает блок TRY/CATCH (не ловятся ошибки) при запуске bat-файла  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31863
Кек2017
Все эти файлы запускаются одним батником.
Имеется в виду, что вы выполняете cmd-файл из виндов, а в нём 3 раза выполняется sqlcmd с каждым из этих файлов?

Что то непонятно, что вы делаете.

Каждый файл при отдельном запуске отрабатывается сам по себе, никакого влияния их друг на друга не будет, какие бы там несуществующие таблицы не использовались.
9 янв 17, 19:39    [20086096]     Ответить | Цитировать Сообщить модератору
 Re: Не работает блок TRY/CATCH (не ловятся ошибки) при запуске bat-файла  [new]
Кек2017
Member [заблокирован]

Откуда:
Сообщений: 9
Гавриленко Сергей Алексеевич,

еще одним батником?
9 янв 17, 20:18    [20086208]     Ответить | Цитировать Сообщить модератору
 Re: Не работает блок TRY/CATCH (не ловятся ошибки) при запуске bat-файла  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8570
Кек2017,

как выглядит "Все эти файлы запускаются одним батником."?
10 янв 17, 17:06    [20090350]     Ответить | Цитировать Сообщить модератору
 Re: Не работает блок TRY/CATCH (не ловятся ошибки) при запуске bat-файла  [new]
Кек2017
Member [заблокирован]

Откуда:
Сообщений: 9
Все, ребят, проблема решена. Точнее, разобрана.

Вы все правы насчет общего "оборачивающего" блока, который формируется (неявно) при запуске батника.

И, по сути, ловит ошибки в своем, "общем" (опять же неявном) блоке CATCH.

Всем спасибо, МУЖИКИ
12 янв 17, 10:41    [20097136]     Ответить | Цитировать Сообщить модератору
 Re: Не работает блок TRY/CATCH (не ловятся ошибки) при запуске bat-файла  [new]
Wlr-l
Member

Откуда:
Сообщений: 539
Кек2017,

Действительно, читать не пробовали? Ведь об этом на каждом углу написано.
12 янв 17, 13:12    [20098120]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить