¿Cómo cambiar el orden de las columnas en una tabla usando la consulta SQL en SQL Server 2005?

109

¿Cómo cambiar el orden de las columnas en una tabla usando una consulta SQL en SQL Server 2005?

Quiero reorganizar el orden de las columnas en una tabla usando una consulta SQL.

Himadri
fuente
3
Si se refiere a cambiar la posición de las columnas tal como existen en la tabla, deberá crear una nueva tabla con el orden preferido, insertar los datos de la tabla anterior y luego soltar la tabla original. No hay otra forma (que yo sepa) de hacer eso.
Michael Todd
¿Está hablando del orden de las columnas en una instrucción SELECT o del orden de las columnas en la definición de la tabla?
marc_s

Respuestas:

111

No puedes. El orden de las columnas es solo una cosa "cosmética" que nos importa a los humanos; para SQL Server, casi siempre es absolutamente irrelevante.

Lo que hace SQL Server Management Studio en segundo plano cuando cambia el orden de las columnas allí es recrear la tabla desde cero con un nuevo CREATE TABLEcomando, copiar los datos de la tabla anterior y luego soltarlos.

No hay ningún comando SQL para definir el orden de las columnas.

marc_s
fuente
4
No, no existe tal cosa en SQL Server, y no debería estar en ningún RBDMS real, el orden de las columnas no es un concepto que sea relevante para una tabla SQL
marc_s
68
@marc_s No hay una buena razón para no admitir el orden de las columnas. Incluso si es solo visual. Simplemente puede hacer que sea más fácil mirar los datos en una tabla con un orden de columna dado cuando hace un "SELECCIONAR *". Soy desarrollador y hago este tipo de consultas todo el tiempo. Puede dedicar algo de tiempo con un buen orden de columnas predefinido. Desde cualquier otro punto de vista, por supuesto, no tiene sentido: nada debe depender del orden de las columnas. Por cierto, hay una columna ORDINAL_POSITION q cuando consulta "INFORMATION_SCHEMA.COLUMNS". No sé qué significa ... pero debe tener algo que ver con esto.
JotaBe
18
El orden de las columnas es relevante, por ejemplo, cuando se usa INSERT INTO sin especificar los nombres de las columnas. Otro ejemplo es ORDER BY índice de columna en lugar del nombre de columna. Obviamente, ambas no son prácticas recomendadas, pero SQL Server lo permite, por lo que alguien puede haberlo usado en algún lugar, posiblemente rompiendo el código T-SQL al cambiar el orden de las columnas.
Carvellis
12
@Carvelis: ¡ NUNCA debes usar INSERTsin especificar explícitamente tus columnas de todos modos!
marc_s
2
@marc_s: absolutamente, pero normalmente no soy el único que trabaja en un proyecto. He visto bastantes proyectos en los que la gente ha utilizado este tipo de código.
Carvellis
30

Debe enumerar explícitamente los campos en el orden en que desea que se devuelvan en lugar de usar * para el orden 'predeterminado'.

consulta original:

select * from foobar

devoluciones

foo bar
--- ---
  1   2

ahora escribe

select bar, foo from foobar

bar foo
--- ---
  2   1
Lexu
fuente
La respuesta anterior es incorrecta, ¿no? Esta respuesta muestra literalmente cómo ordenar las columnas, ¿por qué la anterior tiene una marca de verificación y esta no?
Agente Lu
1
@Agent Lu El problema es la redacción de la pregunta original. Marc y yo hemos interpretado la pregunta del OP para 'cambiar el orden de las columnas' de manera diferente. Él hace un fuerte argumento por qué el orden de las columnas es irrelevante en la tabla almacenada (aunque los nombres lo son). Mostré cómo se pueden extraer los datos en un orden de columna diferente. ¡No es lo mismo en absoluto!
lexu
23

según http://msdn.microsoft.com/en-us/library/aa337556.aspx

Esta tarea no es compatible con instrucciones Transact-SQL.

Bueno, se puede hacer usando create/ copy / drop/ renombrar, como respondió komma8.komma1

O puede usar SQL Server Management Studio

  1. En el Explorador de objetos , haga clic con el botón derecho en la tabla con las columnas que desea reordenar y haga clic en Diseño (Modificar en la versión 2005 SP1 o anterior)
  2. Seleccione la casilla a la izquierda del nombre de la columna que desea reordenar. (Puede seleccionar varias columnas manteniendo presionadas las teclas [shift] o [ctrl] en su teclado).
  3. Arrastre la (s) columna (s) a otra ubicación dentro de la tabla.

Luego haga clic en guardar. Este método en realidad elimina y recrea la tabla, por lo que pueden ocurrir algunos errores.

Si la opción Seguimiento de cambios está habilitada para la base de datos y la tabla, no debe utilizar este método.

Si está deshabilitada, la opción Evitar guardar cambios que requieren la recreación de la tabla debe borrarse en el menú Herramientas> Opciones> Diseñadores; de lo contrario, se producirá el error "No se permiten guardar cambios" .

  • Microsoft desaconseja deshabilitar la opción Evitar guardar cambios que requieran la recreación de la tabla , ya que conduce a que la información de seguimiento de cambios existente se elimine cuando se vuelva a crear la tabla, por lo que nunca debe deshabilitar esta opción si el Seguimiento de cambios está desactivado. habilitado!

También pueden surgir problemas durante la creación de claves primarias y externas.

Si se produce alguno de los errores anteriores, el guardado falla, lo que lo deja con el orden de columna original.

robotik
fuente
1
La declaración " This task cannot be performed using Transact-SQL statements." en el documento era incorrecta. Le expliqué al autor y le pedí que lo cambiara por " This task is not supported using Transact-SQL statements.". Hace aproximadamente un día, el autor estuvo de acuerdo y se arregló el documento. Puedes seguir la discusión que tuvimos en GitHub .
Ronen Ariely
@RonenAriely buen trabajo, y gracias por hacérmelo saber.
Actualicé
De nada, @robotik 😀. Espero que todos los que vengan aquí y vean la respuesta con más votos entiendan que es un error total. Desafortunadamente, las comunidades generalmente se comportan como un rebaño (ganado) y una vez que un líder y un contribuyente superior (que se considera el mejor experto) de la comunidad cometió un error, otros lo siguen, como sucedió en este hilo. La gente sigue votando por un error si ya obtuvo muchos votos (el enfoque de: "ya que todos lo dicen, entonces es cierto"), y otras personas que vendrán al foro pensarán que esta es la respuesta correcta.
Ronen Ariely
1
@RonenAriely, por eso siempre me
desplazo
13

Esto es similar a la pregunta sobre ordenar los registros en el resultado de una consulta ... y normalmente a nadie le gusta la respuesta formalmente correcta ;-)

Así que aquí va:

  • según el estándar SQL, las columnas de una tabla no están "ordenadas"
  • como resultado, a select *no obliga a que las columnas se devuelvan en un orden particular
  • Normalmente, cada RDBMS tiene una especie de orden "predeterminado" (normalmente el orden en el que se agregaron las columnas a la tabla, ya sea en la create table' or in thetabla de modificación agregar `declaraciones
  • por lo tanto, si confía en el orden de las columnas (porque está utilizando los resultados de una consulta para catalogar alguna otra estructura de datos de la posición de las columnas), enumere explícitamente las columnas en el orden que desee.
Thorsten
fuente
11

Por supuesto, puede cambiar el orden de las columnas en una declaración SQL. Sin embargo, si desea abstraer el orden de las columnas físicas de las tablas, puede crear una vista. es decir

CREATE TABLE myTable(
    a int NULL,
    b varchar(50) NULL,
    c datetime NULL
);


CREATE VIEW vw_myTable
AS
SELECT c, a, b
  FROM myTable;

select * from myTable;
a  b  c
-  -  -

select * from vw_myTable
c  a  b
-  -  -
mevdiven
fuente
¿Esto cambia el tiempo de consulta?
blindguy
@blindguy no, no cambia el tiempo de consulta
mevdiven
9

En SQLServer Management Studio:

Herramientas -> Opciones -> Diseñadores -> Diseñadores de tablas y bases de datos

  • Anule la selección de 'Evitar guardar cambios que requieran volver a crear la tabla'.

Luego:

  • haga clic derecho en la tabla para la que desea reordenar las columnas.
  • haga clic en 'Diseño'.
  • Arrastre las columnas en el orden que desee.
  • finalmente, haga clic en guardar.

SQLServer Management studio eliminará la tabla y la volverá a crear utilizando los datos.

Tim Connolly
fuente
6

Puede hacerlo creando una nueva tabla, copiando todos los datos, eliminando la tabla anterior y luego cambiando el nombre de la nueva para reemplazar la anterior.

También puede agregar nuevas columnas a la tabla, copiar los datos columna por columna, eliminar las columnas antiguas y luego cambiar el nombre de las columnas nuevas para que coincidan con las antiguas. Un ejemplo simple a continuación: http://sqlfiddle.com/#!3/67af4/1

CREATE TABLE TestTable (
    Column1 INT,
    Column2 VARCHAR(255)
);
GO

insert into TestTable values(1, 'Test1');
insert into TestTable values(2, 'Test2');
GO

select * from TestTable;
GO

ALTER TABLE TestTable ADD Column2_NEW VARCHAR(255);
ALTER TABLE TestTable ADD Column1_NEW INT;
GO

update TestTable 
set Column1_NEW = Column1, 
    Column2_NEW = Column2;
GO

ALTER TABLE TestTable DROP COLUMN Column1;
ALTER TABLE TestTable DROP COLUMN Column2;
GO

sp_rename 'TestTable.Column1_NEW', 'Column1', 'COLUMN';
GO
sp_rename 'TestTable.Column2_NEW', 'Column2', 'COLUMN';
GO

select * from TestTable;
GO
komma8.komma1
fuente
1
Escribí un procedimiento almacenado que hace algo similar. Automatiza la reconstrucción de la tabla usando SQL dinámico. caseyplummer.wordpress.com/2013/07/22/…
Casey Plummer
6

En SQLServer Management Studio:

Tools-> Options-> Designers->Table and Database Designers

Deseleccionar Prevent saving changes that require table re-creation.

Ahora puedes reordenar la mesa.

vikas Chaturvedi
fuente
2

El servidor SQL crea internamente el script. Crea una tabla temporal con nuevos cambios y copia los datos y suelta la tabla actual y luego vuelve a crear la inserción de la tabla desde la tabla temporal. Lo encuentro en la opción "Generate Change script" ssms 2014. Script como este. Desde aquí: Cómo cambiar el orden de las columnas en una tabla usando la consulta SQL

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_emps
    (
    id int NULL,
    ename varchar(20) NULL
    )  ON [PRIMARY]
GO
ALTER TABLE dbo.Tmp_emps SET (LOCK_ESCALATION = TABLE)
GO
IF EXISTS(SELECT * FROM dbo.emps)
     EXEC('INSERT INTO dbo.Tmp_emps (id, ename)
        SELECT id, ename FROM dbo.emps WITH (HOLDLOCK TABLOCKX)')
GO
DROP TABLE dbo.emps
GO
EXECUTE sp_rename N'dbo.Tmp_emps', N'emps', 'OBJECT' 
GO
COMMIT
Subhankar
fuente
1

Si su tabla tiene suficientes columnas, puede intentar esto. Primero cree una nueva tabla con el orden preferido de columnas.

    create table new as select column1,column2,column3,....columnN from table_name;

Ahora suelte la tabla usando el comando drop

    drop table table_name;

ahora cambie el nombre de la tabla recién creada a su nombre de tabla anterior.

    rename new to table_name;

ahora seleccione la tabla, tiene sus columnas reorganizadas como prefería antes.

    select * from table_name;
Hemanth Nukala
fuente
Esto es lo mismo que crear una nueva tabla, copiar datos de la tabla existente a la nueva, eliminar la anterior y cambiar el nombre de la nueva. Hablando estrictamente, esto no cambia el orden de las columnas de la tabla. Como esto crea / copia de la tabla anterior, lleva tiempo para tablas grandes. Por último, pero no menos importante, la sintaxis propuesta no funciona en t-sql.
Jean-François
0

Al final del día, simplemente no puede hacer esto en MS SQL. Recientemente creé tablas sobre la marcha (inicio de la aplicación) usando un procedimiento almacenado que lee de una tabla de búsqueda. Cuando creé una vista que los combinaba con otra tabla que había creado manualmente anteriormente (el mismo esquema, con datos), falló, simplemente porque estaba usando '' Seleccionar * UNION Seleccionar * 'para la vista. Al mismo tiempo, si utilizo solo los creados a través del procedimiento almacenado, tengo éxito.

En conclusión: si hay alguna aplicación que depende del orden de las columnas, realmente no es una buena programación y seguramente creará problemas en el futuro. Las columnas deben 'sentirse' libres de estar en cualquier lugar y usarse para cualquier proceso de datos (INSERT, UPDATE, SELECT).

Chagbert
fuente
0

Puedes lograrlo con estos pasos:

  1. elimine todas las claves externas y la clave principal de la tabla original.

  2. cambiar el nombre de la tabla original.

  3. usando CTAS cree la tabla original en el orden que desee.

  4. deja caer la vieja mesa.

  5. aplicar todas las restricciones a la tabla original

Ravichandra Aj
fuente
0

Si las columnas que se van a reordenar se han creado recientemente y están vacías, las columnas se pueden eliminar y volver a agregar en el orden correcto.

Esto me sucedió, extendiendo una base de datos manualmente para agregar nueva funcionalidad, y había perdido una columna, y cuando la agregué, la secuencia era incorrecta.

Después de no encontrar una solución adecuada aquí, simplemente corrigí la tabla usando el siguiente tipo de comandos.

ALTER TABLE  tablename  DROP COLUMN  columnname; 
ALTER TABLE  tablename  ADD columnname columntype;

Nota: solo haga esto si no tiene datos en las columnas que está eliminando.

La gente ha dicho que el orden de las columnas no importa. Utilizo regularmente SQL Server Management Studio "generar scripts" para crear una versión de texto del esquema de una base de datos. Para controlar de forma eficaz estas secuencias de comandos (git) y compararlas (WinMerge), es imperativo que la salida de las bases de datos compatibles sea la misma y que las diferencias resaltadas sean diferencias genuinas de la base de datos.

El orden de las columnas sí importa; ¡pero solo para algunas personas, no para todos!

Iván
fuente
0

Supongo que desea agregar una nueva columna en una posición específica. Puede crear una nueva columna moviendo las columnas actuales hacia la derecha.

+---+---+---+
| A | B | C |
+---+---+---+

Elimine todos los índices afectados y las referencias de claves externas. Agregue una nueva columna con exactamente el mismo tipo de datos que la última columna y copie los datos allí.

+---+---+---+---+
| A | B | C | C |
+---+---+---+---+
          |___^

Cambie el tipo de datos de la tercera columna al mismo tipo que el de la columna anterior y copie los datos allí.

+---+---+---+---+
| A | B | B | C | 
+---+---+---+---+
      |___^

Cambie el nombre de las columnas en consecuencia, vuelva a crear índices eliminados y referencias de claves externas.

+---+---+---+---+
| A | D | B | C | 
+---+---+---+---+

Cambie el tipo de datos de la segunda columna.

Tenga en cuenta que el orden de las columnas es solo una cosa "cosmética", como dijo marc_s .

Václav Dajbych
fuente
-1

Utilizar

SELECT * FROM TABLE1

que muestra el orden predeterminado de las columnas de la tabla.

Si desea cambiar el orden de las columnas.

Especifique el nombre de la columna para mostrar correspondientemente

SELECT COLUMN1, COLUMN5, COLUMN4, COLUMN3, COULMN2 FROM TABLE1
solairaja
fuente
La pregunta no se trata de pedidos temporales. La pregunta trata sobre la estructura del diseño de la tabla cuando modifica la tabla y agrega nuevas columnas.
vikas Chaturvedi
-1

puede usar la indexación .. Después de la indexación, si selecciona * de XXXX, los resultados deben ser según el índice, pero solo el conjunto de resultados .. no la estructura de la tabla

Karthik.M
fuente
-1

Puede cambiar esto usando una consulta SQL. Aquí está la consulta SQL para cambiar la secuencia de la columna.

ALTER TABLE table name 
CHANGE COLUMN `column1` `column1` INT(11) NOT NULL COMMENT '' AFTER `column2`;
Aashay Shah
fuente
Me pregunto si esto cae y recrea la tabla como en SSMS. De cualquier manera, no lanzaría los dados haciendo esto en una base de datos de producción, aunque este método parece interesante y vale la pena investigarlo.
samis
Esta funcionalidad no funciona en SQL Server como lo especificó el OP. Ojalá lo hiciera.
Proyecto de ley
1
Esta es la sintaxis de MySQL, no SQL Server.
Jon Schneider
-1

Para tener un orden de columna específico, debe seleccionar columna por columna en el orden que desee. El orden de selección dicta cómo se ordenarán las columnas en la salida.

Nauris Krūmiņš
fuente
-1

Prueba este comando:

alter table students modify age int(5) first; 

Esto cambiará la posición de edad a la primera posición.

Mwavu Rogers
fuente
Este no es un SQL válido en MSSQL. Quizás MySQL o algún otro dialecto, pero no para SQL Server 2005
nsimeonov
-2

alterar el nombre de la tabla modificar el nombre de la columna int (5) primero; traerá la columna a la primera alterar el nombre de la tabla modificar el nombre de la columna int (5) después de (nombre de la tabla);

Farhan sait
fuente
-3

Ejemplo: Cambiar la posición de field_priority después de field_price en el estado de la tabla.

ALTER TABLE `status` CHANGE `priority` `priority` INT(11) NULL DEFAULT NULL AFTER `price`;
lecaoquochung
fuente
2
Esta es la sintaxis de MySQL, no SQL Server.
Jon Schneider