Обработка ошибок с помощью командного файла и Sqlcmd - PullRequest
14 голосов
/ 26 апреля 2011

У меня есть пакетный файл, который выполняет некоторые запросы SELECT с использованием sqlcmd, помещает результаты в текстовые файлы и загружает эти файлы на FTP-сервер.Это все работает так, как должно, вот как мне нравится, когда все работает.

Мне было интересно, что бы я сделал в случае ошибки.Допустим, кто-то изменяет структуру данных базы данных, которую я бью, и не уведомляет меня.Если бы я запустил оператор sqlcmd SELECT и уронил результат в текстовый файл, я бы просто получил текстовый файл с ошибкой, который затем сразу отправлялся бы на FTP, как будто ничего не случилось.(Я проверял это.)

Я хотел бы иметь возможность проверять наличие ошибок из sqlcmd - тайм-ауты, неверные учетные данные, некорректный запрос и т. Д., Я просто не уверен, как это сделать.или что такое "лучшая практика".Я всегда мог попытаться просканировать выходной текстовый файл и найти ошибки, которые, как мне кажется, могут произойти, но это проблематично по ряду причин.

У кого-нибудь есть какой-либо опыт с этим, которым он хотел бы поделиться?

Ответы [ 4 ]

12 голосов
/ 26 апреля 2011

Вы можете проверить errorlevel, возвращенный из SQLCMD, чтобы увидеть, не удалось ли это.

    sqlcmd -b <yourscript>
    IF ERRORLEVEL 1 goto err_handler
    goto done
    :err_handler
    REM handle the error here

    :done 
    REM script completion code here
9 голосов
/ 26 апреля 2011

Я бы, возможно, начал с помещения возвращаемых значений в ваш SQL, например:

DECLARE @IsBored bit = 1

... do work ...

SELECT 0 -- Success!

Вы могли бы пойти немного дальше и использовать блоки TRY / CATCH для перехвата ошибок и возврата кода ошибки.С SQLCMD вы можете использовать код возврата из вашего SQL в качестве кода завершения приложения, например:

sqlcmd -b -S ServerName -E -d DbName -q "EXIT(EXEC dbo.YourProc)" 
       -o "C:\Logs\output.log" -u

Если вы управляли своими вызовами SQLCMD с помощью чего-то вроде планировщика, вы могли бы выполнять действия на основекоды возврата из SQLCMD.Поскольку вы просто используете пакетные файлы, я думаю, вы можете сделать что-то вроде этого:

@ECHO OFF
sqlcmd -b -S ServerName -E -d DbName -q "EXIT(EXEC dbo.YourProc)" 
       -o "C:\Logs\output.log" -u
IF %ERRORLEVEL% NEQ 0 ECHO "Error"

Удачи!

2 голосов
/ 14 февраля 2014
for %%G in (*.sql) do (sqlcmd /S %sqlhost% /d %sqldbname% -E -b -i "%%G" >> output.txt if ERRORLEVEL 1 exit)

Выше код будет перебирать все * .sql в папке. Если в каком-либо из сценариев обнаружена ошибка, она будет зарегистрирована в файле output.txt и немедленно остановит пакетный процесс.

0 голосов
/ 26 апреля 2011

Я построил мини-язык в Python для решения аналогичной проблемы. Используя библиотеку подпроцесса, вы можете запустить свой код через sqlcmd, затем получить выходные данные и любые коды ошибок. Проанализируйте вывод перед тем, как поместить его в текстовый файл, и, если необходимо, просмотрите состояния исправления ошибок. Эти состояния могут изменить код или параметры и повторить отправку их через sqlcmd. Если ничего не помогло, напишите человеку.

Конечно, так как я использовал Python таким образом, я совсем не беспокоился о sqlcmd и просто использовал библиотеки Python odbc для прямого подключения к базе данных. Я мог откатить свои транзакции, если у меня произошел катастрофический сбой, запустить его в интерактивном режиме или через командный файл и т. Д. И т. Д.

Хотя это куча работы. Для более простой проверки ошибок просто добавьте фильтр в свой конвейер, скажем, grep или awk. Или сверните свое собственное с flex.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...