2009-01-20 7 views
33

¿Por qué SQL 2008 de repente quiere abandonar mis tablas cuando voy a cambiar el tipo de columna de decir int a real? Esto nunca sucedió en SQL 2005, que yo sepa. Cualquier idea sería útil, por favor.Cómo cambiar una columna sin eliminar una tabla en SQL 2008

+0

Esta respuesta en SF responde correctamente [http://stackoverflow.com/a/11035353/1711106][1] [1]: http://stackoverflow.com/a/11035353/1711106 –

Respuesta

32

En SQL Server 2008, vaya a Herramientas >> Opciones. En la pequeña ventana, haga clic en "Diseñador". Desactive la opción "Impedir guardar cambios que requieren ..."

=====

Editado el 4 de sept 2015.

He añadido esta respuesta aquí hace mucho, mucho tiempo describiendo la forma en que resolvería la situación descrita en la pregunta anterior. Desde entonces, los usuarios en los temas a continuación han expuesto varias preocupaciones sobre hacer las cosas de la manera que recomendé en ese momento. Básicamente, la solución que describí podría ser problemática en algunos escenarios. Luego sugiero que continúe leyendo para verificar los comentarios de otros usuarios y elegir la mejor solución para usted.

+0

Ya encontré la respuesta, pero gracias por la ayuda. – Middletone

+6

¡Pero deja caer la mesa! No es una forma funcional para tablas extragrandes –

+21

Esta no es una respuesta a la pregunta, sino un ajuste para dejar caer silenciosamente la tabla sobre los cambios estructurales, ¡lo cual es muy malo en mi humilde opinión! – Jan

38

No puedo creer que la respuesta principal haya estado presente durante tanto tiempo, ¡es un consejo muy peligroso!

Hay pocas operaciones que se pueden hacer in-situ sin perder su mesa:

Si se encuentra en una situación en la que no es posible modificar una columna sin soltar la tabla, generalmente puede usar un SELECT INTO consulta para proyectar sus datos en una nueva tabla, luego suelte la tabla anterior (deshabilitando temporalmente las restricciones) y luego cambie el nombre de la tabla proyectada. Sin embargo, en este caso tendrá que dejar su base de datos fuera de línea para el mantenimiento.

0

Tengo el mismo problema. A pesar de que mi cuenta tiene derechos de seguridad si intento usar otra cuenta sa, funciona. Parece que de alguna manera mi cuenta no tiene la capacidad de alterar. sigue investigando, pero es un problema de permiso.

actualización:

No puedo expandirlo. pero esto es lo que hice. hay dos grupos de dominio a los que pertenece mi cuenta. Uno era un nuevo grupo de dominio AD y el otro era un grupo de dominios NT legay. Una vez que eliminé el grupo de dominios heredados, pude modificar la tabla con éxito. Tenga en cuenta que ambos grupos tenían "sa" privilegios.

El comportamiento era que los comandos alter daban como resultado el éxito, pero nada cambiaba en la tabla. Luego, cuando intenté manualmente cambiar los campos a través del diseñador, me quejé de que no se me permitía hacer cambios si se requería descartar y volver a crear la tabla. Encontré la configuración en las herramientas y pude apagarlo. Pero esta mesa es enorme y no es una buena idea hacer esto. Yo aconsejaría a otros en contra de eso.

por lo que fue un problema de permiso.No puedo explicar cómo, pero espero que ayude a alguien más

24

Aquí es lo que yo uso:

-- Add new column 
ALTER TABLE MyTable 
ADD Description2 VARCHAR(MAX) 
GO 

-- Copy data to new column (probably with modifications) 
Update MyTable 
SET Description2 = Description 
GO 

-- Drop old column 
ALTER TABLE MyTable 
DROP COLUMN Description 
GO 

-- Rename new column to the original column's name. 
sp_RENAME 'MyTable.Description2' , 'Description', 'COLUMN' 
GO 
  1. copia los datos en una nueva columna.
  2. Suelta la columna anterior.
  3. Cambie el nombre de la nueva columna por el nombre de la columna anterior.
+0

¿Cómo afecta esta estrategia al índice si la columna está indexada? – Dave

+0

Por lo que sé, tendrá que volver a crear los índices en esa columna. La acción anterior debería eliminarlos a todos (o para reformularlos mejor: debería eliminar la columna de todos los índices asociados). – user2173353

+0

La segunda instrucción en 'Copiar datos a columna nueva' no funcionará porque 'Descripción2' sería un objeto/columna no válida – usefulBee

0

Otra forma de esta sin perder totalmente la mesa es

  1. Tome una copia de seguridad de los valores de las columnas.
  2. Hacer que la columna sea nula si no permite nulos. Establecer los valores de las columnas a ser nula por haciendo

    update tablename set columnname = null 
    
  3. eliminar la columna
  4. Inserte una nueva columna con el mismo nombre que la columna de borrado y el tipo que desea
  5. insertar los datos guardados en este columna
Cuestiones relacionadas