SQL Server: завершить запуск SQL - PullRequest
2 голосов
/ 05 июня 2009

Есть ли способ заставить скрипт не запускаться, если оператор if верен даже с "GO"?

Например, я хочу сделать что-то похожее на следующее:

insert into table1 (col1, col2) value ('1', '2')
GO
if exists(select * from table1 where col1 = '1')
  BEGIN
    --Cause Script to fail
  END
GO
insert into table1 (col1, col2) value ('1', '2') --Wont run

Фактическая цель этого состоит в том, чтобы запретить запуск сценариев / вставок / удалений / обновлений при создании таблиц более одного раза, когда мы отбрасываем пакеты для работы администраторов баз данных.

Ответы [ 4 ]

4 голосов
/ 05 июня 2009

GO - это не ключевое слово transact-sql - это фактически терминатор пакетов, понятный обычным инструментам SQL Server. Если вы используете его в своем приложении, ваше приложение не будет работать.

Почему бы тебе не сделать что-то подобное?

IF NOT EXISTS (select * from table1 where col1 = '1')
BEGIN
     --Do Some Stuff
END

Вместо того, чтобы прервать выполнение сценария, если условие соответствует , следует запускать сценарий, только если условие не выполнено.

Кроме того, вы можете заключить код в процесс и использовать RETURN для выхода из процесса.

1 голос
/ 05 июня 2009

Согласно документации, некоторые значения, переданные для серьезности RAISEERROR () , могут вызывать различные уровни завершения.

Наибольший интерес представляют (если вы запускаете сценарий через SQL Management Studio или аналогичный и хотите предотвратить любую попытку выполнить любые последующие команды в файле):

Уровни серьезности от 20 до 25 считаются смертельными. Если обнаружен неустранимый уровень серьезности, клиентское соединение прерывается после получения сообщения, и ошибка регистрируется в журналах ошибок и приложений.

0 голосов
/ 05 июня 2009

Используйте goto. Звучит некрасиво, но отлично подходит для этого.

Редактировать - нм, это не работает. Должно быть, это был сон, когда я думал, что видел, как это работает

0 голосов
/ 05 июня 2009

Вы не указали, какой инструмент используете для запуска указанного скрипта. У инструментов sqlcmd и osql есть параметр -b 'При сбое пакетной обработки' , который выполняет именно то, что вы запрашиваете. Просто замените 'Потому что скрипт t fail' на RAISERROR("failure", 16, 1).

@ Jason Я бы настоятельно рекомендовал не использовать уровни ошибок выше 16 в ваших сценариях. Для одного уровня выше 18 требуются привилегии sysadmin для начала. Во-вторых, они могут запускать все виды автоматических ответов от административного мониторинга на месте и даже внутри системы с помощью механизма , включая радикальные меры, такие как инициирование отработки отказа или перевод базы данных в автономный режим. И, наконец, что не менее важно, они будут тратить много времени впустую, если кто-то расследует настоящий инцидент: «аппаратный сбой за час до сбоя, хм, позвольте мне разобраться в этом».

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