我有一个smalldatetime列,需要更改为datetime列。这将是安装过程的一部分,因此它不能是手动过程。不幸的是,该列有一些索引,并且约束不为空。索引与性能相关,仅需要使用新数据类型保留索引。是否可以编写一条语句,使我在保留相关信息的同时仍可以更改列数据类型?如果是这样,该怎么办?
最佳答案
您无法使用适当的索引,唯一约束,外键约束或检查约束将数据类型从smalldatetime更改为datetime。您必须先将它们全部删除,然后再更改类型。然后:
alter table T alter column TestDate datetime not null
然后重新创建仍然适用的约束和索引。
生成放置和创建的一些不同方法:
1)如果为所有索引和约束都指定了明确的名称,则安装程序可以在每种环境(开发,测试,用户接受测试,性能测试等,生产环境)中运行静态脚本。
要生成此显式脚本,您可以:
a)使用SSMS(或与SQL Server 2000,企业管理器一起)编写create和drop语句的脚本。
b)从源代码存储库开始工作,以发现依赖对象的名称和定义,并将适当的静态脚本放在一起。
c)尝试运行alter语句。看看它失败了。查找定义并手写放置并创建。 (个人而言,这对于编写drop非常有用,而不是擅长创建。)
2)如果没有为所有索引和约束都指定显式名称,则安装程序将必须在数据字典中查询适当的名称,并使用动态SQL以正确的顺序运行drop,然后再使用alter column语句和然后,以正确的顺序在alter列之后创建。
如果您知道没有约束,而只有索引,这将更加简单。
可能有些工具或库已经知道如何执行此操作。
另外,如果这是一个打包的应用程序,则可能无法确保本地DBA尚未添加索引。
注意:如果存在唯一约束,它将建立一个索引,您将无法使用DROP INDEX删除该索引。
关于sql - 更改列数据类型时保留SQL索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1258380/