SQL Server Management Studio (или SQL Server) оценивает * все * выражения? - PullRequest
0 голосов
/ 10 июня 2010

Вот моя конфигурация:

  • У меня есть повторно запускаемый пакетный скрипт, который я использую для обновления своей базы данных.
  • Внутри этого пакетного сценария у меня есть код, который говорит:следующее:
    • Если таблица 'A' не существует, создайте таблицу 'A' и вставьте в нее строки.
  • Позже в этом пакетном скрипте ясоздайте привязанную к схеме индексированное представление для этой таблицы.
  • Иногда при повторном запуске сценария, то есть после создания таблицы, SQL Server Management Studio оценивает код «вставка строк», который защищен кодом «Если эта таблица не существует», и выдает следующееошибка:

    Сообщение 1934, уровень 16, состояние 1, строка 15 ВСТАВИТЬ не удалось, поскольку следующие параметры SET имеют неправильные настройки: 'CONCAT_NULL_YIELDS_NULL, ANSI_WARNINGS, ANSI_PADDING, ARITHABORT'.Убедитесь, что параметры SET верны для использования с индексированными представлениями и / или индексами для вычисляемых столбцов и / или отфильтрованных индексов и / или уведомлений о запросах, и / или методов типа данных XML, и / или операций с пространственным индексом.

  • Обратите внимание: если бы кто-то попробовал этот оператор INSERT в вакууме, я бы полностью ожидал, что SSMS выдаст эту ошибку.
    • Но не , если он защищен условным блоком.

Мой вопрос:

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

Ответы [ 2 ]

0 голосов
/ 10 июня 2010

Обратите внимание, что большинство упомянутых вами настроек относятся к уровню соединения, т. Е. Если вы установите или измените их, они остаются в силе, если вы не закроете соединение или явно не измените их значение.

Возвращаясь к вашему вопросу. Упоминаемая вами ошибка выглядит как ошибка во время выполнения, то есть вставка фактически выполняется. Было бы лучше, если бы вы могли показать свой сценарий (опуская детали, но сохраняя партии).

Редактировать: это не компилятор SSMS, который оценивает SQL, который вы пытаетесь выполнить - это SQL Server. Что вы подразумеваете под «оценить»? Это «выполнить»? Когда вы запускаете пакет (то, что фактически выполняется сервером), SQL Server сначала выполняет синтаксический анализ и выдает ошибку, если он обнаруживает любую синтаксическую ошибку, ничего не происходит исполнено в этот момент. Если синтаксис в порядке, сервер начинает выполнять ваш пакет.

Опять же, ошибка, которую вы показываете, кажется время выполнения - так что, я думаю, вы внимательно следите за условиями и отслеживаете, что происходит (или предоставляете нам более подробную информацию о 'иногда «).

0 голосов
/ 10 июня 2010

Да, он оценивает их все, взгляните на это

declare @i int
select @i =1

if @i = 1
begin
    declare @i2 int
    set @i2 = 5
end
else 
begin
    declare @i2 int
    set @i2 = 5
end

Сообщение 134, Уровень 15, Состояние 1, Строка 12 Имя переменной '@ i2' уже объявлено. Имена переменных должны быть уникальными в пакете запроса или хранимой процедуре.

Другой пример с временными таблицами приведен здесь: Что такое отложенное разрешение имен и зачем вам это нужно?

Ваш единственный выход - заключить его в динамический SQL

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