Он пытается скомпилировать все эти операторы перед выполнением 1-го:
ALTER TABLE [dbo].ttt ADD b NVARCHAR
UPDATE [dbo].ttt
SET b = a
ALTER TABLE [dbo].ttt DROP COLUMN a
(На самом деле, он пытается скомпилировать весь пакет , не только эти операторы, но точка все еще остается - в момент, когда он пытается скомпилировать UPDATE
, столбец не существует)
Когда он пытается скомпилировать оператор UPDATE
, он просматривает метаданные таблицы и правильно находит, что столбец не существует.
Попробуйте EXEC
оператор обновления.
EXEC('UPDATE [dbo].ttt
SET b = a');
А также то, что Одед говорит о том, что вы, вероятно, хотите указать размер столбца (в противном случае по умолчанию используется самый бессмысленный тип данных - nvarchar(1)
)
Этот скрипт определенно работает без ошибок:
CREATE TABLE ttt(a nvarchar)
IF NOT EXISTS ( SELECT *
FROM sys.columns
WHERE object_id = OBJECT_ID('dbo.ttt')
AND name = 'b' )
AND EXISTS ( SELECT *
FROM sys.columns
WHERE object_id = OBJECT_ID('dbo.ttt')
AND name = 'a' )
BEGIN
ALTER TABLE [dbo].ttt ADD b NVARCHAR
EXEC('UPDATE [dbo].ttt
SET b = a');
ALTER TABLE [dbo].ttt DROP COLUMN a
END