将计算列转换为常规列

19

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

我想将它转换为常规列,同时保留当前值。

我需要重新创建这个列并在事务中更新整个表吗?还是可以仅更改计算列的规范?如何操作?

5个回答

22
-- 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
我需要保留列的名称。 - George Polevoy
2
然后在删除PersistedColumn之后使用EXEC sp_rename 'newColumn','PersistedColumn','COLUMN'进行重命名。 - IDisposable

7
海报希望保留列的名称。我在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'

3

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

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

-1

在SSMS表的设计模式中,只需从“计算列规范”中删除公式即可。值将保留在列中。


这种方式管理工作室实际上会重新创建表并重新插入值。由于生产中有一个大型数据库,所以这对我来说行不通。 - George Polevoy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接