我在SQL Server 2005的大表中有一个持久的计算列。
我想将其转换为常规列,保持当前值。
我是否必须重新创建列并在事务中更新整个表, 或者是否可以只改变计算列规范,以及如何做?
答案 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)
要解决此问题,请添加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'