Pregunta

¿Es posible agregar una columna a una tabla en una posición ordinal específico en Microsoft SQL Server?

Por ejemplo, nuestros cuadros siempre tienen CreatedOn, CreatedBy, LastModifiedOn, columnas lastModifiedBy en el "extremo" de cada definición de la tabla? Me gustaría que la nueva columna a aparecer en SSMS por encima de estas columnas.

Si estoy scripting todos mis cambios de bases de datos, hay una manera de preservar este orden al final de la tabla?

Para su información, no estoy tratando de iniciar una guerra llama en si esto aún debe 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

¿Fue útil?

Solución

Hay que crear una tabla temporal que refleja el esquema de la tabla original, pero con el orden de las columnas que desea, a continuación, copia el contenido del original a la temperatura. Eliminar el original y cambiar el nombre de la temperatura.

Esto es lo que hace SQL Management Studio detrás de las escenas.

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

Otros consejos

entrar en SQL Server Management Studio, y el "diseño" de una tabla existente. Insertar una columna en el medio, haga clic derecho en un área vacía y seleccione Generar el Cambio guión ...

Ahora mira a la secuencia de comandos que crea. Básicamente se creará una tabla temporal con el orden de las columnas adecuado, insertar los datos de la tabla original, eliminar la tabla original y cambiar el nombre de la tabla temporal. Esto es probablemente lo que necesita hacer.

 introducir descripción de la imagen aquí

También puede ser necesario para desactivar esta opción para permitir la creación de guiones de cambio

 introducir descripción de la imagen aquí

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 / Cambiar nombre

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 el botón 'Guardar' después de añadir una nueva columna para el inicio de una mesa.

/* 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: agregar la columna / actualizar / DROP COLUMN / RENAME

Este método implica básicamente la creación de una copia de las columnas existentes que desee añadir a la 'derecha' de la nueva columna, la transferencia de los datos a la nueva columna, a continuación, dejar caer los originales y cambiar el nombre de los nuevos. Esto causar estragos en cualquier índice o limitaciones que tiene, ya que hay que re-apuntar ellos. Es técnicamente posible, pero de nuevo mucho tiempo tanto 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.

Que yo sepa no hay ningún método conocido para cambiar el orden de la columna. Detrás de las escenas SQL Management Studio hace lo que dijo José Basilio. Y si usted tiene una mesa grande, entonces es poco práctico para cambiar las órdenes de columnas como esta manera.

Puede utilizar una "vista". Con vistas SQL se puede utilizar cualquier orden que desee sin ser afectado por los cambios de columna de tabla.

TFS 2013 lo hará de forma automática .

Añadir la nueva columna (s) a su mesa de todos modos que te gusta, y luego confirmar los cambios a TFS. Desde allí se puede abrir el archivo sql de la tabla en Visual Studio y mover manualmente el orden de las columnas de la T-SQL CREATE guión. A continuación, puede actualizar su base de datos de destino mediante el esquema de VS herramienta de comparación encontrado en Herramientas> SQL Server> Nuevo esquema de comparación. Elija su proyecto de base de datos con su cambio como la fuente y la base de datos que desea actualizar como objetivo. Comparar, seleccionar el guión de la mesa, y Actualizar. VS caerá y agregar automáticamente. Todos sus datos estarán seguros, y los índices también.

sucio y simple.
tabla de exportación a CSV.
Insertar nuevos datos en la posición deseada.
Drop table.
Crear nueva tabla con las especificaciones de columna deseada.
columnas de carga de csv a la nueva mesa.

Lo que creo que es simple es añadir la columna ALTER TABLE tabla1 AÑADIR .. y luego crear una tabla tmp como tmp_table1 del selecto como SELECT col1,col2,col5,col3,col4 into tmp_table1 from table1; y luego dejar caer tabla1 y cambiar el nombre del tmp_table1 a la Tabla 1, eso es todo. Espero que ayude a alguien

No estoy seguro de si el hilo está todavía activo. Estaba teniendo la misma consulta con la base de datos MySQL. Haciendo clic derecho en la tabla y seleccionando auto 'ALTER' genera el código de abajo. Muestra proporciona desde db Sakila y funcionó. Sólo averiguar la columna después de la cual desea colocar su nueva columna y el uso 'después' de la palabra clave

ALTER TABLE `sakila`.`actor` 
CHANGE COLUMN `middle_name` `middle_name` VARCHAR(50) NULL DEFAULT NULL AFTER `first_name`; 

seleccionar todo la columna en la tabla temporal, y crear nueva tabla con nueva columna que desea  eliminar la tabla de edad, seleccione toda la columna de la tabla temporal y se insertan en la nueva columna con el pedido. y sin pérdida de datos

select * FROM TEMP
select * from originaltbl
select * from #Stagintbl 



declare @ColumnName nvarchar(max);
set @ColumnName=(select
   distinct  
    stuff((
        select ',' + a.COLUMN_NAME
        from (select Column_name from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME='originaltbl') a

        for xml path('')
    ),1,1,'') as ColumnName)

declare @Sqlquery nvarchar(max)
set @Sqlquery='select '+@ColumnName+' from  #Stagintbl'+'';
Insert into originaltbl
Execute(@Sqlquery)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top