SQL Server:能否通过单条ALTER TABLE语句添加列并设置计算值?
在SQL Server中用单条ALTER TABLE完成列添加与值设置的方案
当然可以啦!在SQL Server里有两种实用的方式,能让你通过单条ALTER TABLE语句同时完成新增列和为现有行设置计算值的操作,不用再分开执行添加和更新两步:
1. 使用计算列(推荐,适合需要动态同步的场景)
如果你的datetime2_asdatetime2列的值需要和原datetime2_asstring列保持同步(比如原列更新后新列自动跟着变),可以直接创建计算列。这种列的值会基于指定的表达式自动计算,不需要手动维护:
ALTER TABLE 你的数据表名 ADD datetime2_asdatetime2 AS CAST(datetime2_asstring AS datetime2) PERSISTED;
- 加上
PERSISTED关键字后,计算结果会被物理存储在磁盘上,查询时不需要重复计算,性能更好;如果不需要持久化,去掉这个关键字即可(但每次查询都会重新计算值)。 - 注意:
datetime2_asstring列的所有值必须能被正确转换为datetime2类型,否则创建计算列会失败。
2. 带DEFAULT约束+WITH VALUES(适合静态值的场景)
如果希望新增列的值是一次性基于原列计算的静态值(后续原列更新不影响新列),可以通过添加临时DEFAULT约束并配合WITH VALUES子句来实现:
ALTER TABLE 你的数据表名 ADD datetime2_asdatetime2 datetime2 CONSTRAINT DF_Temp_Datetime2_Convert DEFAULT CAST(datetime2_asstring AS datetime2) WITH VALUES;
执行完这条语句后,现有行的datetime2_asdatetime2列会自动填充转换后的值,后续新增的行如果不指定该列的值,会默认使用这个转换逻辑。如果不需要这个默认约束了,可以再执行一条语句删掉它:
ALTER TABLE 你的数据表名 DROP CONSTRAINT DF_Temp_Datetime2_Convert;
同样要注意:原列的所有值必须能正确转换为datetime2,否则这条ALTER TABLE语句会报错。
内容的提问来源于stack exchange,提问作者Developer Marius Žilėnas
相关产品推荐
相关产品推荐

