2008-08-04 13 views
73

Si agrego una columna a una tabla en Microsoft SQL Server, ¿puedo controlar dónde se muestra la columna lógicamente en las consultas?¿Puedo reordenar las columnas lógicamente en una tabla?

No quiero meterme con el diseño físico de las columnas en el disco, pero me gustaría agrupar lógicamente las columnas cuando sea posible para que herramientas como SQL Server Management Studio enumeren los contenidos de la tabla de manera conveniente.

Sé que puedo hacerlo a través de SQL Management Studio yendo a su modo de "diseño" para tablas y arrastrando el orden de las columnas, pero me gustaría poder hacerlo en SQL sin formato para que puede realizar el pedido con guiones desde la línea de comando.

+0

demasiado tarde para una respuesta, pero echar un vistazo a este enlace. http://blog.sqlauthority.com/2013/03/11/sql-server-how-to-add-column-at-specific-location-in-table/ – sqluser

+0

ver también http://stackoverflow.com/questions/4402312/why-cant-i-reorder-my-sql-server-columns y http://stackoverflow.com/questions/5327545/adding-column-between-two-other-columns-in-sql-server –

+0

más cosas relacionadas: http://stackoverflow.com/questions/34818/sql-server-does-column-order-matter y http://dba.stackexchange.com/questions/18719/does-the-order-of-columns -in-a-tables-definition-matter –

Respuesta

61

No puede hacer esto programáticamente (de una manera segura) sin crear una nueva tabla.

Lo que Enterprise Manager hace cuando se compromete una nueva orden es crear una nueva tabla, mover los datos y luego eliminar la tabla anterior y cambiar el nombre de la nueva tabla al nombre existente.

Si quiere sus columnas en un orden/agrupación particular sin alterar su orden físico, puede crear una vista que puede ser lo que desee.

1

Cuando Management Studio lo hace, crea una tabla temporal, copia todo, abandona la tabla original y renombra la tabla temporal. No existe una declaración T-SQL simple y equivalente.

Si no te apetece hacer eso, siempre puedes crear una vista de la tabla con las columnas en el orden que deseas y usarla?

Editar: ¡golpeado!

5

Si entiendo su pregunta, desea afectar qué columnas se devuelven primero, segundo, tercero, etc. en consultas existentes, ¿verdad?

Si todas sus consultas están escritas con SELECT * FROM TABLE, aparecerán en la salida tal como se encuentran en SQL. Si sus consultas están escritas con SELECCIONAR Campo 1, Campo 2 DESDE LA TABLA, entonces el orden en que están establecidas en SQL no importa.

1

Se puede hacer mediante SQL, modificando las tablas del sistema directamente. Por ejemplo, mira aquí:

Alter table - Add new column in between

Sin embargo, yo no recomendaría jugar con las tablas del sistema, a menos que sea absolutamente necesario.

35

Creo que todo lo que falta aquí es que, aunque no todos tienen que lidiar con instancias de 10, 20 o 1000 del mismo sistema de software instalado en todo el país ... aquellos de nosotros que diseñamos software comercialmente vendido hazlo. Como resultado, ampliamos sistemas a lo largo del tiempo, ampliamos tablas agregando campos a medida que se necesita una nueva capacidad, y como esos campos están identificados, pertenecen a una tabla existente y, como tal, más de una década de campos en expansión, crecimiento, adición, etc. a las tablas ... y luego tener que trabajar con esas tablas desde el diseño, hasta el soporte, a veces para indagar en la resolución de problemas/datos crudos para depurar nuevos errores de funcionalidad ... es increíblemente irritante no tener la información primaria que desea ver dentro del primer puñado de campos, cuando puede tener tablas con 30-40-50 o incluso 90 campos y sí en una base de datos estrictamente normalizada.

A menudo he deseado poder hacer esto, por esta razón exacta.Pero a menos de hacer exactamente lo que hace SQL, crear un script de creación para una nueva tabla de la manera que lo deseo, escribirle el inserto y luego eliminar todas las restricciones, relaciones, claves, índice, etc., etc. existentes de la tabla existente y cambiar el nombre la "nueva" tabla vuelve al nombre anterior, y luego lee todas esas claves, relaciones, índice, etc. etc.

No solo es tedioso, consume mucho tiempo, sino ... dentro de cinco años más, necesita volver a suceder ....

Es tan cercano a la pena esa gran cantidad de trabajo, sin embargo, el punto es ... no será la última vez que necesitamos esta capacidad, ya que nuestros sistemas seguirán creciendo , expandir y obtener campos en un ordenamiento wacked impulsado por adiciones de necesidad/diseño.

La mayoría de los desarrolladores piensan desde el punto de vista de un único sistema que sirve a una sola compañía o mercado de caja rígida muy específico.

Los diseñadores "listos para usar" pero significativamente progresivos y los líderes del desarrollo en su espacio de mercado siempre tendrán que lidiar con este problema, una y otra vez ... les encantaría una solución creativa si alguien tiene uno. Esto podría salvar fácilmente a mi empresa una docena de horas a la semana, simplemente sin tener que desplazarme, o recordar dónde está ese campo en la tabla de datos de origen ...

+0

Tuvimos el mismo problema y creamos un procedimiento almacenado que automatiza este proceso (renombrar, crear nueva tabla, copiar, recrear todas las claves externas, restricciones, etc.). Solo necesita pasar el nombre de tabla y el nuevo orden de columnas. Si esto realmente puede ahorrarle a su empresa docenas de horas a la semana, debe invertir el tiempo de escribir un script similar. Para nosotros, nos llevó solo unos 2-3 días tener un script estable que usamos rutinariamente para reordenar columnas. Se ocupa de todas las funciones que utilizamos en SqlServer (por ejemplo, índices parciales, vistas indexadas, etc.) y consta de solo aproximadamente 400 LOC. – Andreas

1

Hay una forma, pero es solo temporalmente la consulta en sí. Por ejemplo,

Digamos que tiene 5 tablas. tabla se llama T_Testing

Nombre, Apellido, Fax, Correo electrónico y MEMBER_ID

que desea que la lista de su identificación, a continuación, Apellido, a continuación, Nombre, Teléfono y luego enviarlos por correo electrónico.

Puede hacerlo de acuerdo con Seleccionar.

Select Member_ID, LastName, FirstName, PhoneNumber, Email 
From T_Testing 

Aparte de eso, si lo que desea el Apellido aquí para ver antes de su primer nombre, por alguna razón, se puede hacer también de la siguiente manera:

Select LastName, * 
From T_Testing 

Lo único que quiero estar seguro de que usted hacer es que el OrdenarPor o cuya función debe ser denotado como table.column si se va a utilizar una Dónde o OrdenarPor

Ejemplo:

Select LastName, * 
From T_Testing 
Order By T_Testing.LastName Desc 

Espero que esto ayude, lo descubrí porque necesitaba hacerlo yo mismo.

+0

En esta consulta Seleccione Apellido, * Desde Prueba_T, obtiene Apellido dos veces. – sqluser

1
  1. Escriba su tabla existente en una ventana de consulta.
  2. Ejecutar esta secuencia de comandos en una base de datos de prueba (quitar el uso declaración)
  3. Use SSMS para hacer que la columna de cambios que necesita
  4. clic en Generar el Cambio Script (más a la izquierda y más inferior icono en la barra de botones, por defecto)
  5. utilizar este script en contra de su mesa real

todo el guión realmente es crear una segunda tabla mesa con las órdenes de columna deseada, copia todos los datos en él, cae la tabla original y luego cambia el nombre de la tabla secundaria a toma su lugar.Esto te ahorra escribirlo tú mismo, aunque deberías desear una secuencia de comandos de implementación.

0

No es posible cambiar el orden de las columnas sin volver a crear toda la tabla. Si solo tiene algunas instancias de la base de datos, puede usar SSMS para esto (seleccione la tabla y haga clic en "diseño").

En caso de que tenga demasiados casos para un proceso manual, usted debe tratar de este script: https://github.com/Epaminaidos/reorder-columns

Cuestiones relacionadas