¿Puedo reordenar lógicamente las columnas en una tabla?

93

Si agrego una columna a una tabla en Microsoft SQL Server, ¿puedo controlar dónde se muestra la columna de forma lógica en las consultas?

No quiero alterar 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 el contenido de la tabla de una manera conveniente.

Sé que puedo hacer esto a través de SQL Management Studio entrando en 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 poder realizar el pedido. escrito desde la línea de comandos.

llamada rápida
fuente
Demasiado tarde para una respuesta, pero eche un vistazo a este enlace. blog.sqlauthority.com/2013/03/11/…
sqluser
y otra pregunta relacionada, sobre si es importante stackoverflow.com/questions/6692021/…
Tim Abell
microsoft connect: sintaxis ALTER TABLE para cambiar el orden de las columnas ; la respuesta es de la variedad de tetera de chocolate como de costumbre WONTFIX
Tim Abell

Respuestas:

77

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

Lo que hace Enterprise Manager cuando confirma un reordenamiento es crear una nueva tabla, mover los datos y luego eliminar la tabla anterior y cambiar el nombre de la nueva tabla por el nombre existente.

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

vzczc
fuente
43

Creo que lo que todos aquí están perdiendo 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 y el mundo ... aquellos de nosotros que diseñamos software vendido comercialmente lo hacemos. Como resultado, expandimos los sistemas a lo largo del tiempo, expandimos las tablas agregando campos a medida que se necesita una nueva capacidad y, a medida que esos campos se identifican, pertenecen a una tabla existente y, como tal, más de una década de expansión, crecimiento, adición de campos, etc. a las tablas ... y luego tener que trabajar con esas tablas desde el diseño, hasta el soporte, a veces profundizar en datos brutos / resolución de problemas para depurar nuevos errores de funcionalidad ... es increíblemente agravante no tener la información principal que desea ver dentro del primer puñado de campos,

A menudo he deseado poder hacer esto, por esta misma razón. Pero además de hacer exactamente lo que hace SQL, construir un script de creación para una nueva tabla de la manera que yo quiero, escribir el inserto en él, luego eliminar todas las restricciones, relaciones, claves, índices, etc., etc., existentes, etc. de la tabla existente y renombrar la tabla "nueva" vuelve al nombre anterior, y luego lee todas esas claves, relaciones, índices, etc., etc.

No solo es tedioso, requiere mucho tiempo, sino que ... en cinco años más, tendrá que volver a suceder ...

Está tan cerca de valer la pena esa enorme cantidad de trabajo, sin embargo el punto es ... no será la última vez que necesitemos esta habilidad, ya que nuestros sistemas continuarán creciendo, expandiéndose y obteniendo campos en un orden de locos impulsado por adiciones de necesidad / diseño.

La mayoría de los desarrolladores piensa desde el punto de vista de un solo sistema que sirve a una sola empresa o al mercado de cajas duras muy específico.

Los diseñadores y líderes del desarrollo "listos para usar" pero significativamente progresistas 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 una. Esto fácilmente podría ahorrarle a mi empresa una docena de horas a la semana, simplemente sin tener que desplazarse o recordar dónde está "ese" campo en la tabla de datos de origen ...

Philip Coyner
fuente
Tuvimos el mismo problema y creamos un procedimiento almacenado que automatiza este proceso (cambiar el nombre, crear una nueva tabla, copiar, volver a crear todas las claves externas, restricciones, etc.). Solo necesita pasar el nombre de la tabla y el nuevo orden de columnas. Si esto pudiera ahorrarle a su empresa decenas de horas a la semana, debería invertir tiempo en escribir un guión similar. Para nosotros, solo tomó alrededor de 2-3 días tener un script estable que usamos de manera rutinaria para reordenar las columnas. Se encarga de todas las funciones que usamos en SqlServer (por ejemplo, índices parciales, vistas indexadas, etc.) y consta de solo 400 LOC.
Andreas
No sé por qué no pueden abstraer el diseño de la columna de alguna manera. ¡No tiene que reordenar físicamente las columnas! La cantidad de nivel de PHD y más allá de la ingeniería en Sql Server es realmente asombrosa. Cuando se considera la complejidad de la generación del plan de consultas, las estadísticas, la indexación y nadie se ha puesto de pie todavía y ha dicho 'Hagamos una tabla que represente el orden LÓGICO'. FieldID Guid, OrderBy int. Hecho. Entonces SSMS o SELECT *usa eso. Apáguelo si es un DBA perfecto y no lo quiere. Muy frustrante. Y ahora mis mesas son lo suficientemente grandes como para no poder usar más la fuerza bruta.
Simon_Weaver
Sé que este es un comentario antiguo, pero Visual Studio dentro del proyecto de base de datos crea automáticamente un script SQL para reordenar la columna física cuando cambia el esquema de la tabla y pulsa publicar.
Muflix
5

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

Si todas sus consultas están escritas con SELECT * FROM TABLE, se mostrarán en la salida tal como se presentan en SQL.

Si sus consultas están escritas con SELECT Field1, Field2 FROM TABLE, entonces el orden en que se presentan en SQL no importa.

Otón
fuente
3

Cuando Management Studio lo hace, está creando una tabla temporal, copiando todo, eliminando su tabla original y cambiando el nombre de la tabla temporal. No hay una declaración T-SQL equivalente simple.

Si no le apetece hacer eso, ¿siempre puede crear una vista de la tabla con las columnas en el orden que desee y usarla?

Editar: ¡batido!

etiquetas2k
fuente
1

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

Digamos que tienes 5 mesas. La tabla se llamaT_Testing

FirstName, LastName, PhoneNumber, Email e Member_ID

desea que muestre su ID, luego Apellido, luego Nombre, luego Teléfono y luego Correo electrónico.

Puede hacerlo según la selección.

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

Aparte de eso, si solo desea que el apellido se muestre antes del nombre por alguna razón, también puede hacerlo de la siguiente manera:

Select LastName, *
From T_Testing

Lo único que debe asegurarse de hacer es que la función OrderBy o Where debe indicarse como Table.Column si va a utilizar un Where o OrderBy

Ejemplo:

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

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

Steven
fuente
En esta consulta, seleccione Apellido, * De T_Testing, obtiene Apellido dos veces.
sqluser
1
  1. Guíe su tabla existente a una ventana de consulta.
  2. Ejecute este script en una base de datos de prueba (elimine la declaración de uso)
  3. Use SSMS para realizar los cambios de columna que necesita
  4. Haga clic en Generar secuencia de comandos de cambios (el ícono más a la izquierda y el más abajo en la barra de botones, de forma predeterminada)
  5. Use este script contra su mesa real

Todo lo que el script realmente hace es crear una segunda tabla con el orden de columna deseado, copia todos sus datos en ella, elimina la tabla original y luego cambia el nombre de la tabla secundaria para que ocupe su lugar. Esto le ahorra escribirlo usted mismo, aunque si desea un script de implementación.

Pablo
fuente
0

No es posible cambiar el orden de las columnas sin volver a crear la tabla completa. 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 demasiadas instancias para un proceso manual, debe probar este script: https://github.com/Epaminaidos/reorder-columns

Andreas
fuente