Ошибка «Недопустимое имя столбца» при вызове вставки после создания таблицы

Я разрабатываю SQL-скрипт, используя SSMS, который вносит некоторые изменения в базу данных:

USE MyDatabase; BEGIN TRANSACTION; -- some statements PRINT(N'#1'); IF (EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = N'dbo' AND TABLE_NAME = N'Table1' AND COLUMN_NAME = 'Table2_Id')) BEGIN ALTER TABLE [dbo].[Table1] DROP CONSTRAINT [FK_Table1_Table2_Table2_Id]; ALTER TABLE [dbo].[Table1] DROP COLUMN [Table2_Id]; DROP TABLE [dbo].[Table2]; PRINT(N'Table2 was dropped.'); END PRINT(N'#2'); IF (NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = N'dbo' AND TABLE_NAME = N'Table2')) BEGIN CREATE TABLE [dbo].[Table2] ( [Id] INT NOT NULL PRIMARY KEY IDENTITY, [Number] INT NOT NULL UNIQUE, [Name] NVARCHAR(200) NOT NULL, [RowVersion] TIMESTAMP NOT NULL ); PRINT(N'Table2 was re-created.'); INSERT INTO [dbo].[Table2]([Number], [Name]) VALUES(-1, N'Default value'); PRINT(N'Default value was inserted in Table2.'); END -- some statements COMMIT TRANSACTION; 

Если в Table1 есть столбец с именем Table2_Id , тогда база данных имеет две таблицы ( Table1 и Table2 ) и отношение внешних ключей между ними. В этом случае мне необходимо:

  • падение отношения внешнего ключа FK_Table1_Table2_Table2_Id ;
  • drop foreign key column Table1.Table2_Id ;
  • drop Table2 ;
  • заново создать таблицу 2, используя новую схему таблицы;
  • вставьте значение по умолчанию в Table2 .

Когда я пытаюсь выполнить этот скрипт, я получаю следующие ошибки:

Msg 207, уровень 16, состояние 1, строка 262 Недопустимое имя столбца «Номер».
Msg 207, уровень 16, состояние 1, строка 262 Недопустимое имя столбца «Имя».

Похоже, что SQL Server использует старую схему для Table2 (у которой действительно нет этих столбцов), но как это возможно, если таблица только что была создана с новой схемой?

Что я делаю не так?

Версия сервера – SQL Server 2012 (SP1) – 11.0.3128.0 (X64).

ОБНОВЛЕНИЕ .

Я добавил вызовы PRINT (см. Скрипт выше). В окне сообщений ничего нет, кроме сообщений об ошибках. Итак, скрипт не выполняется … Что происходит?

SQL Server пытается скомпилировать всю партию. Если таблица уже существует, она будет компилироваться в соответствии с ранее существующим определением. Операция, ссылающаяся на новые столбцы, не компилируется, поэтому пакет не выполняется.

Вам нужно сгруппировать заявления, используя новое определение, в новую партию. Если вы используете это в SSMS, просто вставьте GO

 USE MyDatabase; BEGIN TRANSACTION; -- some statements PRINT(N'#1'); IF (EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = N'dbo' AND TABLE_NAME = N'Table1' AND COLUMN_NAME = 'Table2_Id')) BEGIN ALTER TABLE [dbo].[Table1] DROP CONSTRAINT [FK_Table1_Table2_Table2_Id]; ALTER TABLE [dbo].[Table1] DROP COLUMN [Table2_Id]; DROP TABLE [dbo].[Table2]; PRINT(N'Table2 was dropped.'); END GO PRINT(N'#2'); IF (NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = N'dbo' AND TABLE_NAME = N'Table2')) BEGIN CREATE TABLE [dbo].[Table2] ( [Id] INT NOT NULL PRIMARY KEY IDENTITY, [Number] INT NOT NULL UNIQUE, [Name] NVARCHAR(200) NOT NULL, [RowVersion] TIMESTAMP NOT NULL ); PRINT(N'Table2 was re-created.'); INSERT INTO [dbo].[Table2]([Number], [Name]) VALUES(-1, N'Default value'); PRINT(N'Default value was inserted in Table2.'); END COMMIT 

В противном случае вы можете запустить строку нарушения в дочерней партии

  EXEC(N'INSERT INTO [dbo].[Table2]([Number], [Name]) VALUES(-1, N''Default value'');') 
  • Функция SQL не возвращает результатов, но содержимое функции возвращает результаты
  • Имея базовую проблему SQL с использованием Microsoft SQL Server 2012
  • Как выбрать все даты с 2002 по 2013 год в Microsoft Sql Server 2012
  • Есть ли способ генерировать миллионные адреса mac более эффективно?
  • Почему я не могу подключиться к общему экземпляру SQL Server 2012 LocalDB?
  • Не удается подключить образец базы данных в SQL Server 2012
  • Разрешить удаленное подключение только для определенных пользователей
  • Недостаток узла главной таблицы, SQL Server 2012 SP1
  • Не удалось подключиться к SQL Server в Hydro GeoAnalyst
  • Перечислите все рабочие даты между двумя датами в SQL
  • Как изменить имя сервера SQL2012 на localhost?
  • Давайте будем гением компьютера.