Этот код работает:
create table a (b bit);
alter table a alter column b nvarchar(20);
go
update a
set b = substring(b, 1, 2);
Этот код не:
create procedure p as
begin
alter table a alter column b nvarchar(20);
update a
set b = substring(b, 1, 2);
end;
Почему бы и нет?Первый код фактически изменяет таблицу, поэтому update
является правильным при запуске.Внутри хранимой процедуры два оператора скомпилированы, но не запущены.Это означает, что update
скомпилирован, но таблица не изменилась.Следовательно, вы получаете сообщение об ошибке.
Хотя вы можете решить эту проблему с помощью динамического SQL, я бы вместо этого спросил, почему вы изменяете типы столбцов в хранимой процедуре.Это кажется довольно нерегулярным.Обычно хранимые процедуры не выполняют таких изменений.