Преобразование вычисленного столбца в обычный столбец
У меня есть постоянный вычисленный столбец в большой таблице в 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'