我有一个smalldatetime列,我需要更改为一个datetime列.这将是安装过程的一部分,因此它不能是手动过程.不幸的是,该列有一些索引和一个非空的约束.索引是性能相关的,只需要使用新的数据类型即可保留.是否可以编写一个语句,允许我保留相关信息,同时仍然更改列数据类型?如果是这样,怎么办?
解决方法
您无法使用索引,唯一约束,外键约束或检查约束将数据类型从smalldatetime更改为datetime.在更改类型之前,您必须将其全部删除.然后:
alter table T alter column TestDate datetime not null
然后重新创建仍然适用的约束和索引.
1)如果您给所有索引和约束提供了明确的名称,那么您的安装程序可以在每个环境(dev,test,用户验收测试,性能测试等)中运行静态脚本.
要生成此显式脚本,您可以:
a)使用SSMS(或与sql Server 2000,企业管理器)脚本创建和删除语句.
b)从源代码库工作,发现依赖对象的名称和定义,并将相应的静态脚本放在一起.
c)尝试运行alter语句.看看它失败了.查找定义并手写下落并创建. (就个人而言,写下这个滴滴的效果非常好,而不是那么好).
2)如果您没有为所有索引和约束提供明确的名称,那么您的安装程序将必须在数据字典中查询适当的名称,并使用动态sql在alter column语句之前以正确的顺序运行drop,那么按照正确的顺序创建alter列之后.
如果您知道没有约束,并且只是索引,这将更简单.
可能有工具或图书馆已经知道如何做到这一点.
另外,如果这是打包的应用程序,您可能不会放心本地DBA没有添加索引.
注意:如果有唯一的约束,它将构建一个索引,您将无法使用DROP INDEX删除它.