2010-11-10 2 views
10

У меня есть сохраненный вычисляемый столбец в большой таблице в в SQL Server 2005.Преобразовать вычисляемый столбец в регулярную колонку

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

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

+0

Я бы сказал бывший. – leppie

+2

В чем преимущество материализации сохраненной колонки в «реальный» столбец? –

+0

To Mitch Wheat: Это задача миграции в старой базе данных. –

ответ

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

Мне нужно сохранить имя столбца. –

+1

Затем выполните переименование после удаления PersistedColumn с EXEC sp_rename 'newColumn', 'PersistedColumn', 'COLUMN' – IDisposable

0

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

+0

Эта студия управления способом фактически воссоздает таблицы и повторно вводит значения. Это большая база данных в производстве, поэтому она не работает для меня. –

2

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

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

Документация по sp_rename http://msdn.microsoft.com/en-us/library/ms188351.aspx – IDisposable

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'