Вопрос

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

  • У меня есть перенесенный пакетный скрипт, который я использую для обновления моей базы данных.
  • Внутри этого пакетного скрипта у меня есть код, который говорит:
    • Если таблица «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 впервые делает синтаксический анализ и бросает ошибку в случае, если он находит любой синтаксический Ошибка, ничто не выполняется на данный момент времени. В случае синтаксиса в порядке, сервер начинает выполнять пакет.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top