SQL-скрипт, который запускается только после добавления команды 'GO' - PullRequest
0 голосов
/ 11 июля 2019

Я знаю, что уже много написано о том, что делает GO и когда его использовать, но я не видел ничего, что объясняло бы следующий сценарий.

Мы получили несколько хранимых процедур с приложением для заполнения набора статических таблиц хранилища, но они выдавали сообщения об ошибках.Каждая процедура имеет следующую структуру:

exec usp_CreateDWTable

insert into dbo.DWTable
Select [somefields]
from [SomeLiveTables]

Хранимая процедура usp_CreateDWTable состоит из:

if exists (select * from sysobjects where id = object_id('dbo.DWTable') and sysstat & 0xf = 3)
drop table dbo.DWTable

CREATE TABLE dbo.DWTable(CONSTRAINT [field1] PRIMARY KEY (Alert_ID),[field2],,,)

Выполнение, как указано выше, возвращает сообщение об ошибке: сообщение 213, уровень 16, состояние 1, строка15 Имя столбца или количество предоставленных значений не соответствует определению таблицы.

В конце концов я выяснил, что добавление GO между EXEC и INSERT решает проблему, но если в любом случае, если команды sql обрабатываются последовательно, то какая разница?Теперь я знаю, что пакет CREATE TABLE должен быть отправлен на сервер, прежде чем вы сможете отправить INSERT, но я прочитал, что sql может обрабатывать этот сценарий неявно, тот факт, что CREATE TABLE находится в sp, мешает этому?

Даже если мое вышеупомянутое предположение верно, дополнительный источник путаницы состоит в том, что у нас есть два экземпляра этой базы данных на сервере, и эта ошибка не возникает в другой базе данных.Структуры обеих баз данных практически идентичны, хотя данные разные.Есть ли в базе данных параметр, который заставляет их вести себя по-разному?

Спасибо

1 Ответ

2 голосов
/ 11 июля 2019

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

Когда вы выполняетесценарий в виде отдельных пакетов (команда GO), операторы drop / create выполняются первыми.Затем пакет оператора вставки затем компилируется и запускается с использованием нового определения таблицы.

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