【发布时间】:2011-05-07 19:55:30
【问题描述】:
我在 SQL Server 2005 的一个大表中有一个持久计算列。
我想将其转换为常规列,保留当前值。
我是否必须在事务中重新创建列并更新整个表, 或者是否可以只更改计算列规范,以及如何做到这一点?
【问题讨论】:
标签: sql-server database schema calculated-columns
我在 SQL Server 2005 的一个大表中有一个持久计算列。
我想将其转换为常规列,保留当前值。
我是否必须在事务中重新创建列并更新整个表, 或者是否可以只更改计算列规范,以及如何做到这一点?
【问题讨论】:
标签: sql-server database schema calculated-columns
-- Create a new Column (unpersisted):
ALTER TABLE MyTable
ADD newColumn DatatypeOfPersistedColumn
GO
UPDATE myTable
SET newColumn = PersistedColumn
GO
-- Delete the persisted column
ALTER TABLE MyTable
DROP COLUMN PersistedColumn
GO
-- Rename new column to old name
EXEC sp_rename 'MyTable.newColumn', 'PersistedColumn', 'COLUMN'
GO
【讨论】:
发帖人想保留栏目名称。我在 Mitch 的代码末尾添加了一行以在删除 PersistedColumn 后进行重命名
-- Create a new Column (unpersisted):
ALTER TABLE MyTable
ADD newColumn DatatypeOfPersistedColumn
UPDATE myTable
SET newColumn = PersistedColumn
-- Delete the persisted column
ALTER TABLE MyTable
DROP COLUMN PersistedColumn
-- Rename the new column to the old name
EXEC sp_rename 'MyTable.newColumn', 'PersistedColumn', 'COLUMN'
【讨论】:
@Mitch Wheat 的解决方案效果很好。但是,有时这会引发“无效列名:newColumn”的错误,因为表在尝试运行更新之前尚未更新。
要解决此问题,请添加 GO 语句将两者分成批次:
-- Create a new Column (unpersisted):
ALTER TABLE MyTable
ADD newColumn DatatypeOfPersistedColumn
GO
UPDATE myTable
SET newColumn = PersistedColumn
-- Delete the persisted column
ALTER TABLE MyTable
DROP COLUMN PersistedColumn
-- Rename new column to old name
EXEC sp_rename 'MyTable.newColumn', 'PersistedColumn', 'COLUMN'
【讨论】:
假设将计算列转换为“真实”列的原因是您希望保留现有值/功能,但在需要时添加覆盖它的能力,您可以添加一个新列(待填充仅在要覆盖现有派生值的情况下),并将计算列的定义更改为 COALESCE(NewColumn, 旧计算定义 )。
【讨论】:
只需在 SSMS 中表格的设计模式中从“计算列规范”中删除公式即可。值将按原样保留在列中。
【讨论】: