2011-02-15 22 views
13

Estoy usando SQL Server 2008 R2 y deseo agregar una nueva columna en un lugar específico en el orden de las columnas en una tabla y no al final. Deseo evitar tener que recrear la tabla. ¿Cómo hago esto sin volver a crear la tabla?SQL Server 2008 R2 Agregar columna a una ubicación específica

decir

Table: Bob 
========== 
    Col1 
    Col2 

Añadir nueva columna.

Table: Bob 
========== 
    Col1 
    NewCol 
    Col2 
+2

¿Por qué tendrías que volver a crear la tabla y por qué te importa el orden de las columnas? –

+0

Posibles duplicados: [Agregar una nueva columna de tabla a la posición ordinal específica] (http://stackoverflow.com/questions/769828/add-a-new-table-table-to-specific-ordinal-position), [Agregar columna en SQL Server en lugar específico?] (http://stackoverflow.com/questions/3968954/add-column-on-sql-server-on-specific-place) –

+0

Gracias por los enlaces, sin embargo, todos mencionan la recreación de la tabla . – GordyII

Respuesta

19

No puede. Las columnas siempre se agregan al final de la lista de columnas. La única forma de cambiar el orden es volver a crear la tabla desde cero.

Dicho esto, nunca debería importarle cuál es el orden físico real de las columnas, ni el orden lógico de las definiciones de columna. Si tiene dependencias en el orden de las columnas, su código está roto. Si espera ganancias de rendimiento por orden de columnas, esos son mitos.

+2

De acuerdo. Sin embargo, a menudo es bueno (especialmente con una gran tabla) tener campos comunes como su clave principal como su primera columna. Aparte de la legibilidad humana, hay CERO importancia para el orden de las columnas, PERO - si insiste, una cosa que podría hacer sería crear una nueva tabla, exportar a granel de la tabla anterior, insertar a granel en la nueva tabla, y luego hacer una drop/sp_rename. Deberá asegurarse de evitar que ocurran cambios en la tabla original durante este tiempo, o ejecutar una secuencia de comandos de inserción/actualización de sincronización antes de colocar/cambiar el nombre dentro de la misma transacción. – mattmc3

+3

Sí, la única razón para hacerlo es la legibilidad humana, y solo entonces si hubo una manera fácil de hacerlo. Parece que no es fácil sin volver a crear la mesa. Gracias a todos por responder la pregunta. – GordyII

9

No lo hagas. Esto va junto con el consejo de nunca usar SELECT *, en cuyo caso ya que está enumerando todas las columnas, ¿por qué es importante su orden interna?

Dicho esto, si es absolutamente necesario, aquí hay una demostración que no deja caer la mesa. Sin embargo, las columnas deben abandonarse, ya que no puede insertar en el medio.

create table BOB(col1 int, colspace int, col2 int, col3 varchar(10)) 
insert BOB values (1,3, 2,'test') 
; 
alter table BOB add col2_copy int, col3_copy varchar(10), NewCol datetime 
; 
update BOB set col2_copy = col2, col3_copy = col3 
; 
alter table BOB drop column col2 
alter table BOB drop column col3 
; 
alter table BOB add col2 int, col3 varchar(10) 
; 
update BOB set col2 = col2_copy, col3 = col3_copy 
; 
alter table BOB drop column col2_copy 
alter table BOB drop column col3_copy 
; 

select * from BOB 

Se vuelve mucho más difícil una vez que tiene limitaciones y valores predeterminados.

+1

Perdón por llover en su desfile, pero después de hacer todo esto ejecute 'select * from sys.system_internals_partition_columns ic join sys.partitions p en ic.partition_id = p.partition_id donde object_id = object_id ('BOB')' y mire cuidado en el resultado. Y si aún tiene dudas, mire la hoja_offset de column_id 8. 'DROP COLUMN' no quita nada, simplemente marca la columna como 'no utilizada'. Columnas especialmente fijas, todavía ocuparán todo ese espacio. –

+1

Ahora, si arroja una ALTER TABLE ... REBUILD al final, entonces sí, las columnas se descartan. Pero todavía recreó la tabla (aunque internamente, y manteniendo todas las restricciones y permisos en su lugar). En su mayoría, la diferencia es académica, pero cuando el tamaño de los datos es prohibitivo, el hecho de que la mesa haya sido reconstruida, de una forma u otra, marca la diferencia (es decir, no se puede hacer). –

+0

@remus La respuesta fue académica de todos modos, ya que las primeras palabras son ** no ** para hacerlo. Sirve para mostrar cómo mover las columnas (visualmente) para cualquier front-end que desee un pedido específico (internamente) 'tal vez sea un DAL que solo use select *'. Por favor, siéntase libre de agregar una respuesta a la pregunta con detalles y detalles más detallados. – RichardTheKiwi

1

No he podido ver script lo que está intentando hacer. Sin embargo, en SSMS (en v 10.5 como mínimo) puede hacer clic con el botón derecho en una tabla en el explorador de objetos y seleccionar Diseño. Esto le permite insertar una columna en cualquier lugar del orden de las columnas. También conserva cosas en su tabla como referencias FK, etc.

No he investigado para verificar lo que SQL Server está haciendo realmente entre bastidores y no lo uso para despliegues, pero está allí.

+1

Dependiendo de la definición específica de la nueva definición de columna, esto aún podría volver a crear la tabla. – SchmitzIT

-2

puede hacer esto haciendo clic con el botón derecho en la tabla y vaya al diseño y cambie el orden arrastrando y soltando.

Cuestiones relacionadas