sql - 更改列数据类型时保留SQL索引

标签 sql sql-server tsql

我有一个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/

相关文章:

sql - RowNumber() 和 SUM() 在一个查询中

c# - 插入语句奇怪的错误

mysql - 试图找到与 MySQL 等效的 iSeries SQL 命令。特别是 "LABEL ON"命令

sql - 取一个带有数量字段或项目计数的表,并动态地为每个字段创建唯一的行

c# - 如何查找和配置 SSIS 包所需的参数以从代码中执行它们

sql - 月粮改为日粮

sql - 查找SQL函数的调用者

SQL 外连接函数

SQL Azure : More Intermittent Timeouts

mysql - 为什么仅使用索引不能解决这个结果?