2012-05-18 33 views
10

Tengo una columna que creo que ha sido declarada erróneamente. Contiene datos y no deseo perder los datos.Modificar un tipo de columna con datos, sin borrar los datos

deseo de cambiar la definición de varchar (max) a varchar (un entero). ¿Estaba bajo la impresión de que no puedo alterar el tipo de columna?

¿Es el mejor método para crear una columna temporal, "columna2", transferir los datos a esta columna desde la columna con el tipo problemático, eliminar la columna problema y cambiar el nombre de la columna temporal a la columna problemática original?

Si es así, ¿Cómo se copian los valores de la columna el problema a la nueva columna?

EDITAR: Para cualquier persona con el mismo problema, puede simplemente utilice las instrucciones ALTER.

Respuesta

16

Mientras los tipos de datos son algo "relacionado" - sí, se puede hacer absolutamente esto.

Puede cambiar INT a BIGINT - el rango de valores del segundo tipo es más grande, por lo que no corre el riesgo de "perder" ningún dato.

Puede cambiar VARCHAR(50) a VARCHAR(200) - de nuevo, los tipos son compatibles, el tamaño es cada vez mayor - sin riesgo de truncar nada.

Básicamente, sólo tiene

ALTER TABLE dbo.YourTable 
ALTER COLUMN YourColumn VARCHAR(200) NULL 

o lo que sea. Siempre y cuando no tengas ninguna cadena más larga que esos 200 caracteres, estarás bien. No estoy seguro de lo que sucederá si tuviera cadenas más largas: la conversión fallará con un error o continuará diciéndole que algunos datos podrían haber sido truncados. Así que sugiero que primero intente esto en una copia de sus datos :-)

Se pone un poco más complicado si necesita cambiar una VARCHAR a un INT o algo por el estilo -, obviamente, si tiene valores de columna no "ajuste" en el nuevo tipo, la conversión fallará. Pero incluso el uso de una nueva columna "temporal" por separado no solucionará esto; es necesario tratar con esos casos "no compatibles" de alguna manera (ignórelos, deje NULL allí, configúrelos con un valor predeterminado, algo).

Además, cambiar entre VARCHAR y NVARCHAR puede ser complicado si tiene, por ejemplo, caracteres no occidentales europeos: es posible que pierda ciertas entradas en la conversión, ya que no se pueden representar en el otro formato, o la conversión "predeterminada" de un tipo al otro no funciona como se esperaba.

+1

Funciona para 'CHAR' a' VARCHAR' e incluso recorta el relleno. –

+0

Tengo problemas para cambiar de VARCHAR a TEXT, ¿alguna idea? – Murilo

+1

@Murilo: dado que 'TEXT' ya está ** en desuso ** y se eliminará muy pronto, ** NO ** modificaría una columna * a * tipo de datos' TEXTO' - en su lugar, use 'VARCHAR (MAX)', realmente necesita más de 8000 caracteres de datos –

0

añadir un columna2 temp con el tipo varchar (NN), ejecute update tbl set column2 = column, comprobar si ocurre cualquier error; si todo está bien, modifique su columna original, copie datos y elimine column2.

1

Calcular la tienda longitud de datos max int que la columna de dicho cuadro.

Select max(len(fieldname)) from tablename 

ya se puede disminuir el tamaño de la columna hasta que resulte puso en consulta anterior.

ALTER TABLE dbo.YourTable 
ALTER COLUMN YourColumn VARCHAR(200) NULL 
+0

¿Es este el primer paso necesario si mira el esquema de la tabla en primer lugar? –

+0

desea disminuir un campo varchar, por lo que este debería ser el primer paso. –

+1

Me disculpo. Leí mal y pensé que se estaba expandiendo, no reduciendo. –

Cuestiones relacionadas