Вы не можете изменить тип данных с smalldatetime на datetime при наличии индексов, уникальных ограничений, ограничений внешнего ключа или проверочных ограничений. Вам придется отбросить их все до изменения типа. Тогда:
alter table T alter column TestDate datetime not null
Затем воссоздайте ограничения и индексы, которые все еще применяются.
Некоторые разные подходы для создания дропа и создания:
1) Если вы дали явные имена всем индексам и ограничениям, тогда ваш установщик может запустить статический сценарий в каждой среде (dev, test, приемочное тестирование пользователя, тестирование производительности и т. Д., Production.)
Чтобы сгенерировать этот явный скрипт, вы можете:
a) Используйте SSMS (или с SQL Server 2000, администратором предприятия) для создания сценариев операторов create и drop.
б) Работа с вашим хранилищем исходного кода, чтобы найти имена и определения зависимых объектов и собрать соответствующий статический сценарий.
c) Попытайтесь запустить оператор alter. Посмотрите, что он терпит неудачу. Посмотрите определения и вручную напишите каплю и создайте. (Лично это было бы здорово для написания дропа, но не очень хорошо при создании.)
2) Если вы не указали явные имена для всех индексов и ограничений, тогда ваш установщик должен будет запросить в словаре данных соответствующие имена и использовать динамический SQL для запуска отбрасываний в правильном порядке перед изменением. оператор столбца, а затем создает в правильном порядке после столбца изменения.
Это будет проще, если вы знаете, что нет никаких ограничений, а есть только индексы.
Там могут быть инструменты или библиотеки, которые уже знают, как это сделать.
Кроме того, если это упакованное приложение, вы не можете быть уверены, что локальные администраторы баз данных не добавили индексы.
ПРИМЕЧАНИЕ. При наличии уникального ограничения будет создан индекс, который вы не сможете удалить с помощью DROP INDEX.