Оценивает ли SQL Server Service Studio (или SQL Server) * Все * выражения?
-
26-09-2019 - |
Вопрос
Вот моя конфигурация:
- У меня есть перенесенный пакетный скрипт, который я использую для обновления моей базы данных.
- Внутри этого пакетного скрипта у меня есть код, который говорит:
- Если таблица «A» не существует, то создайте таблицу «A» и вставить строки в него.
- Позже в этом пакетном скрипте я создаю Schemabound проиндексированный взгляд на этой таблице.
- И если вы уже не знали, Индексированные представления требуют определенных настроек клиента.
Иногда, Когда я повторюсь запустить скрипт, то есть после создания таблицы, студия управления SQL Server оценивает код «вставьте строки», который защищен «если эта таблица не существует» кода и дает следующее ошибка:
MSG 1934, Уровень 16, Состояние 1, Line 15 Вставьте не удалось, потому что следующие параметры набора имеют неправильные настройки: «CONCAT_NULL_YIELDS_NULL, ANSI_WARNIONS, ANSI_PADDING, ARITHABORT». Убедитесь, что настройки параметров верны для использования с индексированными представлениями и / или индексами на вычисленных столбцах и / или отфильтрованных индексах и / или уведомлений о запросах и / или методах типа данных XML и / или / или пространственных индексов.
- Обратите внимание: если кто-то попробовал это оператор вставки в вакууме, я бы полностью ожидать SSMS для создания этой ошибки.
- Но нет когда он защищен условным блоком.
Мой вопрос:
Оценивает ли компилятор SSMS все Выражения, независимо от того, будут ли они на самом деле казнены?
Решение
Да, это оценивает все они, посмотрите на это
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
MSG 134, Уровень 15, Состояние 1, Линия 12 Название переменной «@ i2 'уже объявлено. Имена переменной должны быть уникальными в пределах пакетной или сохраненной процедуры запроса.
Другим примером с TEMP Tabls здесь: Что такое разрешение отложенного имени и почему вам нужно заботиться?
Ваш единственный выход будет обернуть его внутри динамического SQL
Другие советы
Обратите внимание, что большинство настроек, которые вы упоминаете, являются уровнем подключения, то есть в случае, если вы устанавливаете / измените их, они остаются в эффекте, если вы не закроете соединение или явно не измените их значение.
Возвращаясь к вашему вопросу. Ошибка, которую вы упоминаете, выглядит как ошибка времени выполнения, то есть вставка фактически выполняется. Было бы лучше, если бы вы могли показать свой скрипт (опущенные детали, но сохраняя пакет).
Редактировать: Это не компилятор SSMS, который оценивает SQL, вы пытаетесь выполнить - это SQL Server. Что вы имеете в виду под «оценить»? Это «выполнить»? Когда вы запускаете партию (что на самом деле выполняется сервером), SQL Server впервые делает синтаксический анализ и бросает ошибку в случае, если он находит любой синтаксический Ошибка, ничто не выполняется на данный момент времени. В случае синтаксиса в порядке, сервер начинает выполнять пакет.
Опять же, ошибка, которую вы показываете, кажется, время выполнения - Поэтому, я думаю, вы будете внимательно следить за условиями и отслеживать, что происходит (или предоставить нам более подробную информацию о «иногда»).