我在 SQL Server 2005 的一个大表中有一个持久化的计算列。
我想将它转换为常规列,同时保留当前值。
我需要重新创建这个列并在事务中更新整个表吗?还是可以仅更改计算列的规范?如何操作?
我在 SQL Server 2005 的一个大表中有一个持久化的计算列。
我想将它转换为常规列,同时保留当前值。
我需要重新创建这个列并在事务中更新整个表吗?还是可以仅更改计算列的规范?如何操作?
-- 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
-- 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表的设计模式中,只需从“计算列规范”中删除公式即可。值将保留在列中。