2009-04-20 15 views
28

¿Es posible agregar una columna a una tabla en una posición ordinal específica en SQL Server?Agregue una nueva columna de tabla a la posición ordinal específica

Por ejemplo, nuestras tablas siempre tienen CreatedOn, CreatedBy, LastModifiedOn, LastModifiedBy columnas en el "final" de cada definición de tabla? Me gustaría que la nueva columna se muestre en SSMS sobre estas columnas.

Si estoy scripting todos mis cambios en la base de datos, ¿hay alguna manera de conservar este orden al final de la tabla?

FYI, no estoy tratando de instituir una guerra de llama en caso de que esto deba hacerse. Si quiere leer sobre un hilo que degenera rápidamente en que, aquí es una buena:

http://www.developersdex.com/sql/message.asp?p=581&r=5014513

+0

¿O es esta la razón por la que debería crear vistas en la parte superior de cada tabla? –

+0

Relacionados: http://stackoverflow.com/q/1605144/12484 –

Respuesta

23

usted tiene que crear una tabla temporal que refleja el esquema de la tabla original, pero con el orden de las columnas que desea, luego copie los contenidos del original a temp. Elimine el original y cambie el nombre de la temperatura.

Esto es lo que SQL Management Studio hace entre bastidores.

Con una herramienta de sincronización de esquema, puede generar estos scripts automáticamente.

+0

Las tablas de temperatura no pueden renombrarse fuera de 'tempdb'. –

3

ingrese a SQL Server Management Studio, y "diseñe" una tabla existente. Inserta una columna en el medio y mira el script que crea. básicamente creará una tabla temporal con el orden correcto de columnas, insertará los datos de la tabla original, soltará la tabla original y cambiará el nombre de la tabla temporal. Esto es probablemente lo que necesitarás hacer.

3

Que yo sepa, no existe un método conocido para cambiar el orden de la columna. Detrás de escena SQL Management Studio hace lo que dijo José Basilio. Y si tiene una mesa grande, entonces no es práctico cambiar las órdenes de columna de esta manera.

Puede usar una "vista". Con las vistas SQL puede usar cualquier orden que desee sin verse afectado por los cambios en la columna de la tabla.

0

No se puede crear una columna en una ubicación ordinal específica en la estructura de la tabla, además, ¿por qué querrías? El orden de las columnas en SQL Server es totalmente irrelevante.

SQL Server Management Studio tiene una vista de diseño que aparentemente le permite crear una columna en cualquier ubicación de la lista de columnas, pero lo que realmente sucede aquí en el fondo es que se crea la nueva tabla con las nuevas columnas y el viejo se cae.

No hay comandos SQL DDL para crear una columna en una ubicación específica o para "reordenar" columnas. Realmente no es necesario.

Marc

+4

¿Por qué querrías? Para que sea más fácil ver cosas en SSMS. Si, por ejemplo, tengo una tabla que consta de un conjunto de marcas de tiempo que un producto progresa de fábrica, tenerlas de forma natural en la base de datos ayuda a leer los datos en lugar de saltar mucho. Sí, no importa codificar, pero ayuda a reducir la carga cognitiva cuando se trata de depurar cosas. –

+0

@Colin Mackay: Sí, para eso están los puntos de vista. No te olvides de tirar después de la depuración. –

7

La respuesta es sí, es técnicamente posible, pero tendrá un dolor de cabeza hacerlo y que tomará mucho tiempo para ejecutar y configurar.

Uno: Crear/Copiar/gota/Renombrar

Esto es en realidad lo que SQL Server está haciendo en la interfaz gráfica: aquí está un ejemplo de la secuencia de comandos que está generando y ejecutando al hacer clic en 'Guardar' botón después de agregar una nueva columna al comienzo de una tabla.

/* To prevent any potential data loss issues, you should review this script in detail before running it outside the context of the database designer.*/ 
BEGIN TRANSACTION 
SET QUOTED_IDENTIFIER ON 
SET ARITHABORT ON 
SET NUMERIC_ROUNDABORT OFF 
SET CONCAT_NULL_YIELDS_NULL ON 
SET ANSI_NULLS ON 
SET ANSI_PADDING ON 
SET ANSI_WARNINGS ON 
COMMIT 
BEGIN TRANSACTION 
GO 
CREATE TABLE dbo.Tmp_SomeTable 
    (
    MyNewColumn int NOT NULL, 
    OriginalIntColumn int NULL, 
    OriginalVarcharColumn varchar(100) NULL 
    ) ON [PRIMARY] 
    TEXTIMAGE_ON [PRIMARY] 
GO 
ALTER TABLE dbo.Tmp_SomeTable SET (LOCK_ESCALATION = TABLE) 
GO 
SET IDENTITY_INSERT dbo.Tmp_SomeTable ON 
GO 
IF EXISTS(SELECT * FROM dbo.SomeTable) 
    EXEC('INSERT INTO dbo.Tmp_SomeTable (OriginalIntColumn, OriginalVarcharColumn FROM dbo.SomeTable WITH (HOLDLOCK TABLOCKX)') 
GO 
SET IDENTITY_INSERT dbo.Tmp_SomeTable OFF 
GO 
DROP TABLE dbo.SomeTable 
GO 
EXECUTE sp_rename N'dbo.Tmp_SomeTable', N'SomeTable', 'OBJECT' 
GO 

GO 
COMMIT 

Dos: AÑADIR COLUMNA COLUMNA/ACTUALIZACIÓN/DROP/renombrar

Este método consiste básicamente en la creación de una copia de las columnas existentes que desee añadir a la 'derecha' de la nueva columna, transferir los datos a la nueva columna, soltar los originales y renombrar los nuevos. Esto causará estragos con cualquier índice o restricción que tenga, ya que debe volver a marcarlos. Es técnicamente posible, pero de nuevo consume mucho tiempo en términos de desarrollo y ejecución.

CREATE TABLE MyTest (a int, b int, d int, e int) 

INSERT INTO MyTest (a,b,d,e) VALUES(1,2,4,5) 

SELECT * FROM MyTest -- your current table 

ALTER TABLE MyTest ADD c int -- add a new column 
ALTER TABLE MyTest ADD d_new int -- create copies of the existing columns you want to move 
ALTER TABLE MyTest ADD e_new int 

UPDATE MyTest SET d_new = d, e_new = e -- transfer data to the new columns 

ALTER TABLE MyTest DROP COLUMN d -- remove the originals 
ALTER TABLE MyTest DROP COLUMN e 

EXEC SP_RENAME 'MyTest.d_new', 'd'; -- rename the new columns 
EXEC SP_RENAME 'MyTest.e_new', 'e'; 

SELECT * FROM MyTest 

DROP TABLE MyTest -- clean up the sample 

tres: vivir con ella

Esto ofende poderosamente mi sentido del orden ... pero a veces, simplemente no vale la reorganización.

0

TFS 2013 lo hará por usted automáticamente.

Agregue la (s) nueva (s) columna (s) a su mesa de la forma que desee, y luego confirme sus cambios en TFS. Desde allí, puede abrir el archivo sql de la tabla en Visual Studio y mover manualmente el orden de las columnas en el script CREATE de T-SQL. Luego puede actualizar su base de datos de destino utilizando la herramienta de comparación de esquemas de VS que se encuentra en Herramientas> Servidor SQL> Nueva comparación de esquemas. Elija su proyecto de Base de datos con su cambio como fuente y la base de datos que desea actualizar como destino. Compare, seleccione la secuencia de comandos de la tabla y actualice. VS se soltará y se agregará automáticamente. Todos sus datos estarán seguros, e índices también.

0

Sucio y simple.
Exportar tabla a csv.
Inserte datos nuevos en la posición deseada.
Drop table.
Crea una nueva tabla con las especificaciones de columna deseadas.
Cargue columnas de csv en la nueva tabla.

Cuestiones relacionadas