2010-11-10 36 views
10

que tiene una columna calculada persistido en una gran mesa en en SQL Server 2005.Convertir columna calculada a columna regular

quiero convertirlo en una columna regular, manteniendo los valores actuales.

¿Tengo que volver a crear la columna y actualizar toda la tabla en la transacción, o es posible simplemente modificar una especificación de columna calculada y cómo hacerlo?

+0

Yo diría que la primera. – leppie

+2

¿cuál es la ventaja de materializar la columna persistente en una columna 'real'? –

+0

a Mitch Wheat: es una tarea de migración en una base de datos heredada. –

Respuesta

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

Necesito mantener el nombre de la columna. –

+1

Luego realice un cambio de nombre luego de eliminar la PersistedColumn con EXEC sp_rename 'newColumn', 'PersistedColumn', 'COLUMN' – IDisposable

0

Basta con retirar la fórmula de "Especificaciones columna calculada" en el modo el desing de la tabla en SSMS. Los valores permanecerán en la columna tal como están.

+0

De esta forma, el estudio de administración realmente recrea las tablas y reinserta los valores. Es una gran base de datos en producción, por lo que no funciona para mí. –

2

Suponiendo que la razón para convertir la columna calculada en una columna "real" es que desea mantener los valores/funcionalidad existentes, pero agregue la capacidad de anularla cuando lo desee, puede agregar una nueva columna (para ser poblado solo donde se va a anular el valor derivado existente) y cambie la definición de la columna calculada para que sea COALESCE(NewColumn,Antiguo Cálculo Definición).

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

Documentación en sp_rename http://msdn.microsoft.com/en-us/library/ms188351.aspx – IDisposable

0

@La solución de Mill Wheat funciona muy bien. Sin embargo, ocasionalmente esto generará un error con 'Nombre de columna inválido: newColumn' porque la tabla no se ha actualizado antes de intentar ejecutar la actualización.

Para solucionar este problema, agregue una instrucción GO para separar los dos en lotes:

-- 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' 
Cuestiones relacionadas