Возможно, вам лучше стандартизировать стратегию CREATE-COPY-DROP-RENAME (CCDR) и пытаться вносить изменения на месте только в нескольких сценариях, где ваш DDL не потребует перестроения, а не пытается составить исчерпывающий список,Эта стратегия описана здесь: ссылка .
AFAIK, вам разрешено добавлять столбцы в существующую таблицу (без перестройки), если столбец:
- добавлено в конец таблицы AND
- может иметь значение NULL или иметь ограничение по умолчанию
Во всех других случаях MSSQL будет потенциально потерпеть неудачу, если не знает, что использовать в качестве значения в строках вновь добавленного столбца, или потеря данных является результатом (усечение, например).Даже добавленные по умолчанию столбцы, добавленные в середине, будут вызывать перестройку.
Чтобы еще больше усложнить ситуацию, в некоторых случаях успех развертывания будет зависеть от типа data в таблице, а не отпросто задействованная схема.Например, изменение длины столбца на большее значение (varchar(50) --> varchar(100)
), скорее всего, будет успешным;однако уменьшение длины допускается только , иногда .Перенос изменений типа данных - еще один сложный случай.
Короче говоря, я бы всегда перестраивал и редко менял на месте.
-
Для иллюстрацииданные в строке, влияющие на результат:
create table dbo.Yak(s varchar(100));
insert into dbo.Yak
values(replicate('a', 100));
go
-- attempt to alter datatype to 50 (FAIL: String or binary data would be truncated.)
alter table dbo.Yak
alter column s varchar(50);
go
-- shorten the data in row to avoid data loss
delete from dbo.Yak;
insert into dbo.Yak
values(replicate('a', 50));
go
-- again, attempt to alter datatype to 50 (SUCCESS)
alter table dbo.Yak
alter column s varchar(50);
go
select len(s),* from dbo.Yak;
go
--cleanup
drop table dbo.Yak;
go