将计算列转换为常规列

时间:2010-11-10 11:15:58

标签: sql-server calculated-columns

我在SQL Server 2005的大表中有一个持久的计算列。

我想将其转换为常规列,保持当前值。

我是否必须重新创建列并在事务中更新整个表, 或者是否可以只改变计算列规范,以及如何做?

5 个答案:

答案 0 :(得分:13)

-- 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

答案 1 :(得分:5)

-- 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'

答案 2 :(得分:2)

假设将计算列转换为“真实”列的原因是您希望保留现有值/功能,但添加了在需要时覆盖它的功能,您可以添加新列(要填充)仅在覆盖现有派生值的情况下),并将计算列的定义更改为COALESCE(NewColumn, 旧计算定义 )

答案 3 :(得分:0)

只需在SSMS中表格的设计模式中删除“计算列规格”中的公式即可。这些值将按原样保留在列中。

答案 4 :(得分:0)

@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'