Cómo cambiar el tipo de datos de columna en la base de datos SQL sin perder datos

198

Tengo una base de datos de SQL Server y me acabo de dar cuenta de que puedo cambiar el tipo de una de las columnas inta bool.

¿Cómo puedo hacer eso sin perder los datos que ya se ingresaron en esa tabla?

Ivan Stoyanov
fuente
3
¿Has intentado crear una nueva columna de bits, copiando los valores de la columna anterior en la nueva, eliminando la antigua y renombrando la nueva? Todo esto en una transacción, por supuesto, para revertir los problemas.
Radu Caprescu
2
Usted dice "Me acabo de dar cuenta de que puedo cambiar el tipo de una de las columnas de int a bool" No hay ningún tipo de datos booleano. Aunque hay un poco. ¿Estás preguntando cómo puedes hacer esto (como las 2 respuestas hasta ahora han cubierto). ¿O es su pregunta "Me acabo de dar cuenta de que esto es posible: cómo SQL Server hace esto?"
Martin Smith

Respuestas:

329

Puede hacerlo fácilmente con el siguiente comando. Cualquier valor de 0 se convertirá en 0 (BIT = falso), cualquier otra cosa se convertirá en 1 (BIT = verdadero).

ALTER TABLE dbo.YourTable
   ALTER COLUMN YourColumnName BIT

La otra opción sería crear una nueva columna de tipo BIT, llenarla de la columna anterior y, una vez que haya terminado, suelte la columna anterior y cambie el nombre de la nueva por el nombre anterior. De esa manera, si algo sale mal durante la conversión, siempre puede regresar ya que todavía tiene todos los datos.

marc_s
fuente
10
En otras palabras: NULLpermanece NULL, se 0convierte , se convierten Falseen valores distintos de cero (1, -1, 1999, -987 ...) True.
Álvaro González
2
Y nunca haga un cambio como este desde la GUI. Siempre hazlo a través de un guión como este. La GUI caerá y volverá a crear la tabla y eso consume mucho más tiempo. Si la mesa es grande y está en producción, esto puede ser desastroso. Además, todos los cambios en la tabla deben tener un script que esté en control de origen como todos los demás códigos.
HLGEM
1
Añadiría, asegúrese de tener una copia de seguridad actual de la base de datos antes de realizar cualquier cambio estructural en una tabla con datos. Y no ejecute un cambio como este en la producción durante las horas pico de uso si la tabla se usa con frecuencia o es grande.
HLGEM
Aprobé erróneamente las ediciones ... necesito rechazar ... porque no hay mejoras allí ... Ans es perfecto.
Vikash Pathak
22
ALTER TABLE tablename
ALTER COLUMN columnname columndatatype(size)

Nota: si hay un tamaño de columnas, simplemente escriba el tamaño también.

Xyed Xain Haider
fuente
20

Si es un cambio válido.

Puedes cambiar la propiedad.

Herramientas -> Opciones -> Diseñadores -> Diseñadores de tablas y bases de datos -> Desmarcar -> Evitar guardar cambios que requirieron la recreación de la tabla.

Ahora puede cambiar fácilmente el nombre de la columna sin volver a crear la tabla o perder sus registros.

Sathish
fuente
55
Bajo ninguna circunstancia debe realizar cambios en la tabla utilizando la GUI. Volverá a crear la tabla por completo en lugar de usar Alter table y esto causará un problema si desmarca esto y la tabla es grande. Además, debe tener todos los cambios en las tablas en un script en el control de origen.
HLGEM
Mire más de cerca esa opción: está desactivando una seguridad que evitará que la GUI caiga de la mesa. Usted no va a aparecer a los datos de perder, debido a que la interfaz gráfica de usuario volverá a crear la tabla, pero en el servidor que va a ser distribuido, copiado / descenso. Por lo tanto, si hay muchos datos en la tabla, se generará una operación muy grande. Además, creo (no positivo) que ocurre en una sola transacción, por lo tanto, podría completar su registro de transacciones.
JMarsch
1
Supongo que me gustaría agregar una pequeña aclaración a mi comentario anterior. Si solo está haciendo esto en su máquina de desarrollo, probablemente esté bien. Pero no recomendaría usar este método en una base de datos de producción, especialmente si es una misión crítica.
JMarsch
8

¿Por qué crees que perderás datos? Simplemente vaya a Management Studio y cambie el tipo de datos. Si el valor existente se puede convertir a bool (bit), lo hará. En otras palabras, si "1" se asigna a verdadero y "0" se asigna a falso en su campo original, estará bien.

Philippe Leybaert
fuente
1
Si tiene datos en la tabla, esto no funcionará. Cuando intenta cambiar un tipo de columna, SMS afirma que primero debe descartar la tabla ... lo cual, por supuesto, es incorrecto ya que el comando ALTER TABLE ... ALTER COLUMN funciona bien incluso para campos no NULL. Es por eso que pensaron que podrían perder datos.
Tony O'Hagan
1
@ TonyO'Hagan Eso no es cierto. Puede desactivar la advertencia y funcionará bien con los datos existentes. Ver también stackoverflow.com/questions/2947865/…
Philippe Leybaert el
1
¡Está bien! No lo sabia. Solo traté de votarte (atrás) pero SO me lo impide a menos que edites tu respuesta. Tal vez un cambio menor y puedo hacerlo;).
Tony O'Hagan
1
Bajo ninguna circunstancia debe realizar cambios en la tabla utilizando la GUI. Volverá a crear la tabla por completo en lugar de usar Alter table y esto causará un problema si desmarca esto y la tabla es grande. Además, debe tener todos los cambios en las tablas en un script en el control de origen.
HLGEM
Bajo ninguna circunstancia. No hay ninguna razón para usar la GUI para diseñar una tabla o cambiarlas y hay buenas razones para no hacerlo. Todos los cambios deben estar en scripts para poder propagarse a otros servidores y ser tratados como el código que realmente están en el control de origen.
HLGEM
5

si usa T-SQL (MSSQL); deberías probar este script:

ALTER TABLE [Employee] ALTER COLUMN [Salary] NUMERIC(22,5)

si usa MySQL; deberías probar este script:

ALTER TABLE [Employee] MODIFY COLUMN [Salary] NUMERIC(22,5)

si usa Oracle; deberías probar este script:

ALTER TABLE [Employee] MODIFY [Salary] NUMERIC(22,5)
NullException
fuente
3

Vaya a Herramienta-Opción-diseñadores-Diseñadores de tablas y bases de datos y desactive la opción Guardaringrese la descripción de la imagen aquí

saktiprasad swain
fuente
1
Bajo ninguna circunstancia debe realizar cambios en la tabla utilizando la GUI. Volverá a crear la tabla por completo en lugar de usar Alter table y esto causará un problema si desmarca esto y la tabla es grande. Además, debe tener todos los cambios en las tablas en un script en el control de origen.
HLGEM
2

Altere el tipo de datos de columna con el tipo de verificación de columna:

IF EXISTS(
       SELECT 1
       FROM   sys.columns
       WHERE  NAME = 'YourColumnName'
              AND [object_id] = OBJECT_ID('dbo.YourTable')
              AND TYPE_NAME(system_type_id) = 'int'
   )
    ALTER TABLE dbo.YourTable ALTER COLUMN YourColumnName BIT
Ebrahim Sabeti
fuente
1

para mí, en SQL Server 2016, lo hago así

* Para cambiar el nombre de la columna Columna1 a la columna2

EXEC sp_rename 'dbo.T_Table1.Column1', 'Column2', 'COLUMN'

* Para modificar el tipo de columna de cadena a int :( Asegúrese de que los datos estén en el formato correcto )

ALTER TABLE dbo.T_Table1 ALTER COLUMN Column2  int; 
MNF
fuente
0

En la edición compacta, tomará tamaño automáticamente para el tipo de datos de fecha y hora, es decir (8), por lo que no es necesario establecer el tamaño del campo y generar un error para esta operación ...

Hardik
fuente
-2

Puedo modificar el tipo de datos del campo de tabla, con la siguiente consulta: y también en Oracle DB,

ALTER TABLE table_name
MODIFY column_name datatype;
Ismayil S
fuente
No en el servidor SQL
HLGEM
-4

Reemplace el tipo de datos sin perder datos

alter table tablename modify columnn  newdatatype(size);
usuario7743491
fuente