Смена контекста базы данных (то есть выполнение команды USE dbNameHere) — операция несложная. Но, к сожалению, целесообразность присутствия оператора USE всегда подтверждается в процессе синтаксического анализа запросов или пакетов. Иначе говоря, присутствие одного оператора USE в 1, 10, 200, 2000 и т.д. строках кода будет всегда рассматриваться как ДОПУСТИМАЯ операция еще
Измененный код
ДО ТОГО, как начнется фактическое выполнение хотя бы одной строки кода. А это, с учетом того обстоятельства, что база данных MyAGDatabase недоступна, означает, что одним только включением в логику выявления оператора USE проблему не решишь. Сказанное несложно проиллюстрировать. Попытаемся использовать некую базу данных в том и только в том случае, если она существует. Применим для этого код или логику, как в приведенном листинге.
Как указывается в комментариях к коду, базы FakeDB не существует. Но хотя мы помешаем оператор USE внутрь логической конструкции, которая препятствует переходу к оператору USE, это обстоятельство не помешает системе SQL Server выполнить ряд действий:
- произвести синтаксический анализ пакета;
- определить, что мы имеем дело с инструкцией USE FakeDB;
- установить, что базы данных FakeDB не существует и что попытка использовать ее по этой причине недопустима;
- выдать сообщение об ошибке.
И с этим попросту ничего нельзя поделать. В частности, обойти сложившуюся ситуацию не поможет ни один из перечисленных ниже маневров.
Использовать конструкции IF/ ELSE. Как и в приведенных примерах, при обнаружении оператора USE эта конструкция всегда выдает сообщение об ошибке.
Задействовать операторы GOTO. Попытка переломить ситуацию с их помощью не проходит — операторы GOTO тоже наталкиваются на оператора USE.
«Срезать угол» с помощью команды RETURN. Попытка построить простую логическую конструкцию IF NOT PRIMARY, которая обеспечивала бы выполнение команды RETURN до команды USE, тоже ничего не дает. И в этом случае код подвергается синтаксическому анализу до своего фактического выполнения. Кроме того, применение команды RETURN в окне команд или кода для шага задания SQL Server Agent не допускается.