2010-06-03 21 views
14

Soy un poco nuevo en T-SQL, viniendo de un fondo MySQL me estoy adaptando a los diferentes matices en la sintaxis.T-SQL Agregar columna en orden específico

Estoy buscando agregar una nueva columna DESPUÉS de una específica. Descubrí que AFTER es una palabra clave válida, pero no creo que sea la correcta para el trabajo.

ALTER TABLE [dbo].[InvStockStatus] 
ADD [Abbreviation] [nvarchar](32) DEFAULT '' NOT NULL ; 

Ésta es mi consulta actual, que funciona bien, excepto que agrega el campo al final de la tabla, Id prefieren agregar que después de [Name]. ¿Cuál es la sintaxis que estoy buscando para representar esto?

Respuesta

23

No puede hacerlo así

por ejemplo, si usted tiene una tabla como ésta

create table TestTable(id1 int,id3 int) 

y desea agregar otra columna entre id2 ID1 e ID3 entonces aquí es lo de SQL Server hace detrás de la escena si se utiliza el diseñador

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_TestTable 
    (
    id1 int NULL, 
    id2 int NULL, 
    id3 int NULL 
    ) ON [PRIMARY] 
GO 
ALTER TABLE dbo.Tmp_TestTable SET (LOCK_ESCALATION = TABLE) 
GO 
IF EXISTS(SELECT * FROM dbo.TestTable) 
    EXEC('INSERT INTO dbo.Tmp_TestTable (id1, id3) 
     SELECT id1, id3 FROM dbo.TestTable WITH (HOLDLOCK TABLOCKX)') 
GO 
DROP TABLE dbo.TestTable 
GO 
EXECUTE sp_rename N'dbo.Tmp_TestTable', N'TestTable', 'OBJECT' 
GO 
COMMIT 

Como se puede ver si usted tiene una gran cantidad de datos esto puede ser problemático, por qué es importante donde se encuentra la columna?solo use

select col1,col2,col3 from table 
+0

Fue principalmente para la legibilidad en el administrador , tienes razón sin embargo. No necesito que esté en orden, solo tenía curiosidad si se podía hacer. Gracias por la clara ilustración de lo que está sucediendo exactamente. – Aren

5

La secuencia de columnas es realmente irrelevante en un sentido estricto (funcional), en cualquier RDBMS; es simplemente una "elegancia" para la documentación o el ser humano a la vista.

SQL Server no admite ningún comando T-SQL para ordenar las columnas de ninguna manera. Entonces no hay sintaxis en T-SQL para lograr esto.

La única manera de cambiar eso es utilizar el diseñador de tablas visuales en SSMS, que realmente recrea toda la tabla desde cero, cuando se mueve alrededor de columnas o inserta columnas en el medio de una tabla.

2

Las herramientas de comparación de esquemas que he visto crearán una nueva tabla con el orden deseado y luego copiarán los datos de la tabla anterior a la nueva (con algunos cambios de nombre para hacer que la nueva se parezca a la anterior). Teniendo en cuenta cuán incómodo es este enfoque, me imagino que no hay una declaración de T-SQL para agregar una nueva columna en un lugar específico.

+0

Una nota sobre esto, el esquema de Visual Studio comparar hace esto. – Shriike

1

Técnicamente, o tal vez debería decir, académicamente, el orden en que las columnas se agregan a una tabla, o el orden en que se almacenan en el modelo de almacenamiento interno de la base de datos, no debería preocuparle. Simplemente puede listar las columnas en la cláusula Select de sus consultas SQL para controlar el orden en que las columnas o expresiones calculadas aparecen en el resultado de cualquier consulta que ejecute. Internamente, la base de datos tiene la libertad de almacenar los datos reales de la forma que considere adecuada para optimizar el almacenamiento y/o ayudar a alinear los elementos de datos con los límites del disco y/o la memoria.

+0

Seguramente 'ORDER BY' controla el orden de las filas, no el orden de las columnas .. –

+0

true, brain fart .. corregido para corregir –

2

Debe siempre agregar campos solo al final. Debe seleccionar los campos en el orden que desee, pero nunca reestructurar una tabla existente para agregar una columna en el centro. Es probable que esto rompa algunas cosas (donde la gente hace tonterías como seleccionar * o inserta sin especificar las columnas que las personas otorgadas no deberían hacer esas cosas, pero lo hacen).

La recreación de la tabla puede ser un proceso que lleva mucho tiempo sin obtener ganancia alguna y puede causar muchas quejas y bloqueos de usuarios mientras está en proceso.

+0

Un buen punto acerca de romper cosas que usa SELECT * – suriv

6

Si bien desde una perspectiva funcional de la base de datos es correcto que las tuplas puedan aparecer en cualquier orden.

Sin embargo, una base de datos no existe dentro de un vacío. Siempre hay un humano que querrá leer el esquema de la tabla (dbas, devs) y dirigirse a él y mantener o escribir consultas en su contra.

En el pasado, he utilizado las convenciones para las columnas de una tabla como ordenar una tabla con

  1. clave primaria (s) primera
  2. continuación, las claves externas
  3. columnas a continuación, se utilizan con frecuencia
  4. entonces otras columnas
  5. y columnas relacionadas con la comprobación por último

y estos ayudan al escanear una tabla. Lamentablemente, parece que tienes que pasar por aros para mantener el orden, así que ahora tengo que preguntar si vale la pena tener y mantener estas convenciones. Mi nueva regla es solo agregarla al final.

Si está realmente preocupado por el orden desde una perspectiva de legibilidad, debe crear sus propias vistas de 'legibilidad' (quizás en un esquema diferente) en el orden que desee. Puede tener varias vistas de la misma tabla (una para las columnas centrales y otra que incluya elementos que generalmente no son relevantes).

Sería bueno poder reordenar las columnas en los diagramas de base de datos de SQL Server (solo como pantalla), pero esto no es posible.

0

Esto es seguro alrededor sin usar la tabla temporal. Después de agregar la columna hacia el final, simplemente vaya a SQL Sever Management Studio. Haga clic en la tabla, seleccione -> Diseño (o Modificar) y arrastre la última columna a cualquier posición que desee.

De esta manera no tiene que preocuparse por perder datos e índices. La única otra opción es recrear la tabla que puede ser problemático si tiene datos grandes.

Esta respuesta es para ayudar a otras personas y no pretende ser aceptada como respuesta.

+0

Gracias por la respuesta tardía. :) Lamentablemente, necesito una forma de script para hacer esto.También por lo que recuerdo, esto efectivamente hace que el procedimiento de copia de tabla temporal se explique en la respuesta aceptada, justo detrás de las escenas. Gracias por mostrar interés :) – Aren

+1

Oh, yo no quería que esto fuera aceptado. Solo quiero ayudar a otros que puedan encontrar lo mismo. La respuesta aceptada es la respuesta correcta. ¡Gracias por la respuesta! –

+0

marcado como creo que esta respuesta, aunque apreciada, podría ser engañosa! – PapillonUK

0

Ha transcurrido bastante tiempo desde que se publicó esta pregunta, pero vale la pena señalar que si bien el código SQL subyacente subyacente para colocar columnas en un orden específico no ha cambiado, el proceso de generación de scripts para hacerlo se soluciona si elige usar las herramientas de datos de SQL Server en Visual Studio para administrar su base de datos. La base de datos que implemente tendrá siempre las columnas en el orden que especifique en su proyecto.

Cuestiones relacionadas