Преобразование вычисленного столбца в обычный столбец

У меня есть постоянный вычисленный столбец в большой таблице в SQL Server 2005.

Я хочу преобразовать его в обычный столбец, сохраняя текущие значения.

Должен ли я воссоздать столбец и обновить всю таблицу в транзакции, или можно просто изменить вычисленную спецификацию столбца и как это сделать?

Ответ 1

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

Ответ 2

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

Предполагая, что причиной преобразования вычисленного столбца в "реальный" столбец является то, что вы хотите сохранить существующие значения/функциональные возможности, но добавьте возможность переопределить его по желанию, вы можете добавить новый столбец (для заполнения только там, где существующее производное значение должно быть переопределено) и изменить определение вычисленного столбца как COALESCE(NewColumn, Определение старого расчета ).

Ответ 4

Просто удалите формулу из "Вычисляемых спецификаций столбцов" в режиме отображения таблицы в SSMS. Значения будут оставаться в столбце, как есть.

Ответ 5

Решение @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'