SQL Server 2008修改列数据类型且不影响统计信息的方法咨询
SQL Server 2008 修改numeric类型列实操方案
注意:无法在完全不改动现有关联统计信息、索引的前提下直接修改列数据类型,这类对象的元数据直接绑定了列的定义属性,必须临时移除后修改列,再原样重建即可,重建后的索引、统计功能和原有完全一致,不会影响业务查询性能和数据正确性
操作步骤
- 第一步:查询并备份该列所有关联的索引、统计信息创建脚本
查询关联统计信息SQL:
查询关联索引SQL:SELECT s.name AS stats_name, OBJECT_NAME(s.object_id) AS table_name, c.name AS column_name, STATS_DATE(s.object_id, s.stats_id) AS stats_last_update FROM sys.stats s JOIN sys.stats_columns sc ON s.object_id = sc.object_id AND s.stats_id = sc.stats_id JOIN sys.columns c ON sc.object_id = c.object_id AND sc.column_id = c.column_id WHERE OBJECT_NAME(s.object_id) = N'你的实际表名' AND c.name = N'你要修改的列名'SELECT i.name AS index_name, i.type_desc AS index_type, STUFF(( SELECT ',' + c.name FROM sys.index_columns ic JOIN sys.columns c ON ic.object_id = c.object_id AND ic.column_id = c.column_id WHERE ic.object_id = i.object_id AND ic.index_id = i.index_id ORDER BY ic.key_ordinal FOR XML PATH('') ),1,1,'') AS index_columns, i.is_unique, i.is_primary_key FROM sys.indexes i WHERE OBJECT_NAME(i.object_id) = N'你的实际表名' AND EXISTS( SELECT 1 FROM sys.index_columns ic JOIN sys.columns c ON ic.object_id = c.object_id AND ic.column_id = c.column_id WHERE ic.object_id = i.object_id AND ic.index_id = i.index_id AND c.name = N'你要修改的列名' ) - 第二步:按顺序删除关联的索引和统计信息
注意:名称以
_WA_Sys_开头的是系统自动生成的统计,可直接删除,后续可自动或手动重建;用户自定义统计必须提前备份创建脚本-- 先删除索引,如果是主键约束则用ALTER TABLE删除约束 DROP INDEX [索引名] ON [你的实际表名] -- ALTER TABLE [你的实际表名] DROP CONSTRAINT [主键约束名] -- 再删除统计信息 DROP STATISTICS [你的实际表名].[统计信息名] - 第三步:执行列类型修改操作
-- 若列原属性为非空,需补充NOT NULL和原有属性保持一致 ALTER TABLE [你的实际表名] ALTER COLUMN [你要修改的列名] NUMERIC(12,2) NOT NULL - 第四步:按备份的脚本重建所有删除的索引和统计信息
重建完成后可执行全表统计更新保证统计信息准确性:UPDATE STATISTICS [你的实际表名] WITH FULLSCAN
注意事项
- 操作前必须对目标表做全量备份,避免意外数据损失
- 若表数据量较大,建议在业务低峰期执行操作,避免锁表影响正常业务
- 操作完成后抽查数据,确认数值精度符合预期,没有出现截断错误
内容的提问来源于stack exchange,提问作者Nelson Salinas
相关产品推荐
相关产品推荐

