Работать с оператором USE труднее, чем может показаться


Смена контекста базы данных (то есть выполнение команды USE dbNameHere) — операция несложная. Но, к сожалению, целесообразность присутствия оператора USE всегда подтверждается в процессе синтаксического анализа запросов или пакетов. Иначе говоря, присутствие одного оператора USE в 1, 10, 200, 2000 и т.д. строках кода будет всегда рассматриваться как ДОПУСТИМАЯ операция еще

Измененный код

ДО ТОГО, как начнется фактическое выполнение хотя бы одной строки кода. А это, с учетом того обстоятельства, что база данных MyAGDatabase недоступна, означает, что одним только включением в логику выявления оператора USE проблему не решишь. Сказанное несложно проиллюстрировать. Попытаемся использовать некую базу данных в том и только в том случае, если она существует. Применим для этого код или логику, как в приведенном листинге.

Как указывается в комментариях к коду, базы FakeDB не существует. Но хотя мы помешаем оператор USE внутрь логической конструкции, которая препятствует переходу к оператору USE, это обстоятельство не помешает системе SQL Server выполнить ряд действий:

  1. произвести синтаксический анализ пакета;
  2. определить, что мы имеем дело с инструкцией USE FakeDB;
  3. установить, что базы данных FakeDB не существует и что попытка использовать ее по этой причине недопустима;
  4. выдать сообщение об ошибке.

И с этим попросту ничего нельзя поделать. В частности, обойти сложившуюся ситуацию не поможет ни один из перечисленных ниже маневров.

Использовать конструкции IF/ ELSE. Как и в приведенных примерах, при обнаружении оператора USE эта конструкция всегда выдает сообщение об ошибке.

Задействовать операторы GOTO. Попытка переломить ситуацию с их помощью не проходит — операторы GOTO тоже наталкиваются на оператора USE.

«Срезать угол» с помощью команды RETURN. Попытка построить простую логическую конструкцию IF NOT PRIMARY, которая обеспечивала бы выполнение команды RETURN до команды USE, тоже ничего не дает. И в этом случае код подвергается синтаксическому анализу до своего фактического выполнения. Кроме того, применение команды RETURN в окне команд или кода для шага задания SQL Server Agent не допускается.

Комментарии