Я знаю, что уже много написано о том, что делает 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, мешает этому?
Даже если мое вышеупомянутое предположение верно, дополнительный источник путаницы состоит в том, что у нас есть два экземпляра этой базы данных на сервере, и эта ошибка не возникает в другой базе данных.Структуры обеих баз данных практически идентичны, хотя данные разные.Есть ли в базе данных параметр, который заставляет их вести себя по-разному?
Спасибо