2009-10-22 31 views
61

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

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

+2

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 manera (que yo sepa) de hacer eso. –

+0

¿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? –

Respuesta

61

No se puede. El orden de las columnas es solo algo "cosmético" que a los humanos nos importa: 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, se recrea la tabla desde cero con un nuevo comando CREATE TABLE, copiando los datos de la tabla anterior y soltándolos.

No hay un comando SQL para definir el orden de las columnas.

+0

MySQL le permite "reordenar" el orden predeterminado usando 'alter table'. Asumiría que MS SQL Server puede hacer eso también. (Además, creo que solo está después de una consulta, no de almacenamiento) – lexu

+4

No, no existe nada SQL Server, y no debería estar en ningún RBDMS real, el orden de las columnas no es un concepto relevante para una tabla SQL –

+35

@marc_s There no es una buena razón para no respaldar el orden de las columnas. Incluso si solo es visual. Simplemente puede hacer que sea más fácil ver los datos en una tabla con un orden de columna dado cuando se realiza un "SELECT *". Soy desarrollador y hago este tipo de consultas todo el tiempo. Puede ahorrar tiempo con un buen orden de columnas predefinido. Desde cualquier otro punto de vista, por supuesto, no tiene sentido: nada debería depender del orden de las columnas. Por cierto, hay una columna ORDINAL_POSITION cuando consultas "INFORMATION_SCHEMA.COLUMNS". No sé lo que significa ...pero debe tener algo que ver con esto. – JotaBe

18

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

búsqueda original:

select * from foobar 

vuelve

foo bar 
--- --- 
    1 2 

escribir ahora

select bar, foo from foobar 

bar foo 
--- --- 
    2 1 
-1

Uso

SELECT * FROM TABLE1 

que muestra el orden de columnas predeterminado 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 
11

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

Así que aquí va:

  • como según la norma SQL, las columnas de una tabla no están "ordenados"
  • como resultado, un select * no obliga a las columnas a ser devueltos en un orden particular
  • normalmente, cada RDBMS tiene un tipo de orden "por defecto" (generalmente el orden que las columnas se agregaron a la tabla, ya sea en create table' or in the alter table add `statements
  • por lo tanto, si depende del orden de las columnas (porque está utilizando los resultados de una consulta para rellenar alguna otra estructura de datos desde la posición del columnas), enumere explícitamente las columnas en el orden que desee.
8

Por supuesto, puede cambiar el orden de las columnas en una instrucción sql. Sin embargo, si desea abstraer el orden de las columnas físicas de las tablas, puede crear una vista. yo.e

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 
- - - 
+0

¿cambia esto el tiempo de consulta? – blindguy

+0

@blindguy no, no cambia el tiempo de consulta – mevdiven

4

Puede hacerlo mediante la creación de una nueva tabla, copiar todos los datos a través de, caen de la mesa de edad, a continuación, cambiar el nombre de la nueva para sustituir a la antigua.

También podría agregar nuevas columnas a la tabla, copiar los datos de columna por columna, soltar las columnas antiguas, y luego cambiar el nombre de las nuevas columnas para que coincidan con las anteriores. Un simple ejemplo de abajo: 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 
+1

escribí un procedimiento almacenado que hace algo similar. Automatiza la reconstrucción de tablas utilizando SQL dinámico. https://caseyplummer.wordpress.com/2013/07/22/sql-procedure-to-rebuild-a-table-using-a-specific-column-order/ – Casey

12

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

Esta tarea no puede llevarse a cabo utilizando las instrucciones de Transact-SQL.

Bueno, puede ser, usando create/copiar/drop/renombrar, como respondida por komma8.komma1

O puede utilizar SQL Server Management Studio

  1. En 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 versión 2005 SP1 o anterior)
  2. Seleccione el cuadro a la izquierda del nombre de la columna que desea reordenar. (Puede seleccionar varias columnas manteniendo presionadas [shift] o las teclas [ctrl] en su teclado.)
  3. Arrastre la (s) columna (s) a otra ubicación dentro de la tabla.

A continuación, haga clic en guardar. Este método en realidad descarta y recrea la tabla, por lo que pueden ocurrir algunos errores.

Si Change Tracking opción está habilitada para la base de datos y la tabla, no debe usar este método.

Si está desactivada, los evitar guardar cambios que requieren la tabla re-creación opción debe ser limpiado en el menú Herramientas> Opciones> Diseñadores, de lo contrario "Almacenamiento de cambios no está permitido" ocurrirá error.

  • Desactivación de la evitar guardar cambios que requieren la tabla re-creación opción es muy recomendable en contra de Microsoft, ya que conduce al cambio existente seguimiento de la información que se borre cuando se vuelve a crear la tabla, por lo que debe ¡nunca deshabilite esta opción si Change Tracking está habilitado!

También pueden surgir problemas durante la creación de la clave primaria y externa.

Si se produce alguno de los errores anteriores, se produce un error al guardar, lo que le deja con el orden de la columna original.

+0

¡Genial! ........ – Nezir

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 se lee desde una tabla de búsqueda. Cuando creé una vista que combinaba estos con otra tabla que había creado anteriormente (el mismo esquema, con datos), falló, simplemente porque estaba usando '' Seleccionar * UNIÓN Seleccionar * '' para la vista. Al mismo tiempo, si utilizo solo aquellos creados a través del procedimiento almacenado, tengo éxito.

En conclusión: si hay alguna aplicación que dependa 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 ser utilizadas para cualquier proceso de datos (INSERT, UPDATE, SELECT).

0

puede utilizar la indexación .. Después de indexación, si seleccionar * de resultados XXXX deben estar de acuerdo con el índice, pero único resultado establecer .. no structrue de la Tabla

0

Puede cambiar esta consulta SQL usando. 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`; 
+0

Me pregunto si esto cae y vuelve a crear la tabla como en SSMS. De cualquier manera, no lanzaría los dados haciendo esto en un DB de producción, aunque este método parece interesante y vale la pena investigarlo. – samosaris

+0

Esta funcionalidad no funciona en SQL Server como fue especificado por el OP. Ojalá lo hiciera – Bill

+0

Esta es la sintaxis de MySQL, no el servidor SQL. –

0

Usted puede lograr con estos pasos:

  1. quitar todas las claves externas y clave primaria de la tabla original.

  2. cambie el nombre de la tabla original.

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

  4. suelta la tabla anterior.

  5. aplicar todas las limitaciones de vuelta a la mesa de originales

1

Si la tabla tiene suficientes columnas entonces usted puede probar esto. Primero crea una nueva tabla con el orden de columnas preferido.

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

Ahora eliminar la tabla con el comando caída

drop table table_name; 

ahora cambiar el nombre de la tabla recién creada a su nombre de la mesa de edad.

rename new to table_name; 

ahora seleccione la tabla, tiene sus columnas reorganizadas como prefirió antes.

select * from table_name; 
-1

alter table name modify columnname int (5) first; traerá la columna al primer alterar el nombre de la tabla modificar el nombre de la columna int (5) después de (nombre de la tabla);

2

En SQL Server Management Studio:

Herramientas -> Opciones -> Diseño -> Tabla de base de datos y los diseñadores

  • Unselect 'evitar guardar cambios que requieren mesa de re-creación'.

continuación:

  • Haga clic derecho en la tabla que desea volver a ordenar las columnas para.
  • haga clic en 'Diseño'.
  • Arrastre las columnas al orden que desee.
  • finalmente, haga clic en guardar.

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

-2

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`; 
+1

Esta es la sintaxis de MySQL, no SQL Server. –

1

Sql server internamente genera la secuencia de comandos. Crea una tabla temporal con nuevos cambios y copia los datos y descarta la tabla actual y luego recrea la tabla insertada desde la tabla temporal. Lo encuentro desde la opción "Generar cambio de secuencia de comandos" ssms 2014. Guión como este. De Here: How to change column order in a table using sql query

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 
0

Si las columnas se vuelvan a ordenar recientemente se han creado y están vacías, a continuación, las columnas se pueden borrar y volver a agregar en el orden correcto.

Esto me pasó a mí, extendiendo una base de datos manualmente para agregar nuevas funcionalidades, y me perdí 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 va a colocar.

La gente ha dicho que el orden de las columnas no es importante. Regularmente uso SQL Server Management Studio "generar scripts" para crear una versión de texto del esquema de una base de datos. Para controlar de manera efectiva estos scripts (git) y para compararlos (WinMerge), es imperativo que el resultado de las bases de datos compatibles sea el mismo, y las diferencias resaltadas son diferencias de bases de datos genuinas.

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

Cuestiones relacionadas