Come modificare l'ordine delle colonne in una tabella utilizzando la query sql in sql server 2005?


109

Come modificare l'ordine delle colonne in una tabella utilizzando la query SQL in SQL Server 2005?

Voglio riorganizzare l'ordine delle colonne in una tabella utilizzando la query SQL.


3
Se ti riferisci alla modifica della posizione delle colonne così come esistono nella tabella, dovrai creare una nuova tabella con l'ordine preferito, inserire i dati dalla vecchia tabella, quindi rilasciare la tabella originale. Non c'è altro modo (che io sappia) per farlo.
Michael Todd,

Stai parlando dell'ordine delle colonne in un'istruzione SELECT o dell'ordine delle colonne nella definizione della tabella?
marc_s

Risposte:


111

Non puoi. L'ordine delle colonne è solo una cosa "cosmetica" di cui noi umani teniamo: per SQL Server è quasi sempre assolutamente irrilevante.

Ciò che SQL Server Management Studio esegue in background quando si modifica l'ordine delle colonne è ricreare la tabella da zero con un nuovo CREATE TABLEcomando, copiare i dati dalla vecchia tabella e quindi rilasciarla.

Non esiste un comando SQL per definire l'ordinamento delle colonne.


4
No, non esiste nulla di simile per SQL Server - e non dovrebbe essere in alcun RBDMS reale - l'ordine delle colonne non è un concetto rilevante per una tabella SQL
marc_s

68
@marc_s Non c'è una buona ragione per non supportare l'ordine delle colonne. Anche se è solo visivo. Semplicemente può semplificare la visualizzazione dei dati in una tabella con un determinato ordine di colonna quando si effettua un "SELEZIONA *". Sono uno sviluppatore e eseguo questo tipo di query tutto il tempo. Puoi risparmiare un po 'di tempo con un buon ordine di colonne predefinito. Da qualsiasi altro punto di vista, ovviamente, non ha senso: nulla dovrebbe dipendere dall'ordine delle colonne. A proposito, c'è una colonna ORDINAL_POSITION quando interroghi "INFORMATION_SCHEMA.COLUMNS". Non so cosa significhi ... ma deve avere qualcosa a che fare con questo.
JotaBe

18
L'ordine delle colonne è rilevante ad esempio quando si utilizza INSERT INTO senza specificare i nomi delle colonne. Un altro esempio è ORDER BY indice di colonna invece del nome di colonna. Entrambe le pratiche ovviamente non sono consigliate, ma SQL Server lo consente, quindi qualcuno potrebbe averlo usato da qualche parte, probabilmente rompendo il codice T-SQL quando si cambia l'ordine delle colonne.
Carvellis

12
@Carvelis: non dovresti MAI usare INSERTsenza specificare esplicitamente le tue colonne comunque!
marc_s

2
@marc_s: assolutamente, ma di solito non sono l'unico a lavorare su un progetto. Ho visto diversi progetti in cui le persone hanno utilizzato questo tipo di codice.
Carvellis

30

Devi elencare esplicitamente i campi nell'ordine in cui desideri che vengano restituiti invece di utilizzare * per l'ordine "predefinito".

query originale:

select * from foobar

ritorna

foo bar
--- ---
  1   2

ora Scrivi

select bar, foo from foobar

bar foo
--- ---
  2   1

La risposta sopra è sbagliata, non è vero? Questa risposta mostra letteralmente come ordinare le colonne, perché la precedente ha un segno di spunta e questa no?
Agente Lu

1
@Agent Lu Il problema è la formulazione della domanda originale. Marc ed io abbiamo interpretato diversamente la domanda del PO per "cambiare l'ordine delle colonne". Egli sostiene con forza il motivo per cui l'ordine delle colonne è irrilevante nella tabella memorizzata (i nomi sono però). Ho mostrato come i dati possono essere estratti in un diverso ordine di colonna. Non è affatto la stessa cosa!
lexu

23

secondo http://msdn.microsoft.com/en-us/library/aa337556.aspx

Questa attività non è supportata utilizzando le istruzioni Transact-SQL.

Bene, può essere fatto, usando create/ copy / drop/ rename, come risposto da komma8.komma1

Oppure puoi usare SQL Server Management Studio

  1. In Esplora oggetti , fare clic con il pulsante destro del mouse sulla tabella con le colonne che si desidera riordinare e fare clic su Design (Modifica in ver.2005 SP1 o precedente)
  2. Seleziona la casella a sinistra del nome della colonna che desideri riordinare. (Puoi selezionare più colonne tenendo premuti i tasti [shift] o [ctrl] sulla tastiera.)
  3. Trascina le colonne in un'altra posizione all'interno della tabella.

Quindi fare clic su Salva. Questo metodo elimina e ricrea effettivamente la tabella, quindi potrebbero verificarsi alcuni errori.

Se l' opzione Change Tracking è abilitata per il database e la tabella, non dovresti usare questo metodo.

Se è disabilitata, l' opzione Impedisci il salvataggio delle modifiche che richiedono la ricreazione della tabella dovrebbe essere deselezionata nel menu Strumenti> Opzioni> Designer, altrimenti si verificherà l'errore "Il salvataggio delle modifiche non è consentito" .

  • La disabilitazione dell'opzione Impedisci il salvataggio delle modifiche che richiedono la ricreazione della tabella è fortemente sconsigliata da Microsoft, in quanto porta alla cancellazione delle informazioni di rilevamento delle modifiche esistenti quando la tabella viene ricreata, quindi non dovresti mai disabilitare questa opzione se Rilevamento modifiche è abilitato!

Possono sorgere problemi anche durante la creazione di chiavi primarie ed esterne.

Se si verifica uno degli errori precedenti, il salvataggio non riesce, il che ti lascia con l'ordine delle colonne originale.


1
L'affermazione " This task cannot be performed using Transact-SQL statements." nel documento era sbagliata. Ho spiegato l'autore e gli ho chiesto di cambiarlo in " This task is not supported using Transact-SQL statements.". Circa un giorno fa, l'autore ha accettato e il documento è stato corretto. Puoi seguire la discussione che abbiamo avuto su GitHub .
Ronen Ariely,

@RonenAriely buon lavoro, e grazie per avermelo fatto sapere. Ho aggiornato la mia risposta
robotik

Sei il benvenuto @robotik 😀. Spero che tutti coloro che vengono qui e vedono la risposta con il maggior numero di voti capiscano che è un errore totale. Sfortunatamente, le comunità di solito si comportano come una mandria (bestiame) e una volta che un leader e un collaboratore principale (considerato il massimo esperto) nella comunità hanno commesso un errore, altri lo seguono, come è successo in questo thread. La gente continua a votare per un errore se ha già ottenuto molti voti (l'approccio di: "siccome tutti lo dicono, allora è vero"), e le altre persone che verranno al forum penseranno che questa sia la risposta corretta.
Ronen Ariely,

1
@RonenAriely è per questo che scorro sempre verso il basso :)
robotik

13

È simile alla domanda sull'ordinamento dei record nel risultato di una query .. e in genere a nessuno piace la risposta formalmente corretta ;-)

Quindi eccolo:

  • secondo lo standard SQL, le colonne di una tabella non sono "ordinate"
  • di conseguenza, a select *non forza la restituzione delle colonne in un ordine particolare
  • tipicamente, ogni RDBMS ha una sorta di ordine "predefinito" (solitamente l'ordine in cui le colonne sono state aggiunte alla tabella, sia nella create table' or in thetabella di alterazione add `istruzioni
  • pertanto, se ti affidi all'ordine delle colonne (poiché stai utilizzando i risultati di una query per controllare qualche altra struttura di dati dalla posizione delle colonne), elenca esplicitamente le colonne nell'ordine che desideri.

11

Ovviamente puoi cambiare l'ordine delle colonne in un'istruzione sql. Tuttavia, se desideri astrarre l'ordine fisico delle colonne delle tabelle, puoi creare una vista. vale a dire

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

questo cambia il tempo della query?
blindguy

@blindguy no, non cambia l'ora della query
mevdiven

9

In SQLServer Management Studio:

Strumenti -> Opzioni -> Progettisti -> Progettisti di tabelle e database

  • Deseleziona "Impedisci il salvataggio delle modifiche che richiedono la ricreazione della tabella".

Poi:

  • fare clic con il pulsante destro del mouse sulla tabella per la quale si desidera riordinare le colonne.
  • fare clic su "Design".
  • Trascina le colonne nell'ordine desiderato.
  • infine, fai clic su Salva.

SQLServer Management Studio eliminerà la tabella e la ricrea utilizzando i dati.


6

Puoi farlo creando una nuova tabella, copiare tutti i dati, rilasciare la vecchia tabella, quindi rinominare quella nuova per sostituire quella vecchia.

Puoi anche aggiungere nuove colonne alla tabella, copiare i dati colonna per colonna, rilasciare le vecchie colonne, quindi rinominare le nuove colonne in modo che corrispondano a quelle vecchie. Un semplice esempio di seguito: 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
ho scritto una procedura memorizzata che fa qualcosa di simile. Automatizza la ricostruzione della tabella utilizzando SQL dinamico. caseyplummer.wordpress.com/2013/07/22/…
Casey Plummer

6

In SQLServer Management Studio:

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

Deseleziona Prevent saving changes that require table re-creation.

Ora puoi riordinare la tabella.


2

Il server SQL crea internamente lo script. Crea una tabella temporanea con nuove modifiche e copia i dati e rilascia la tabella corrente, quindi ricrea l'inserimento della tabella dalla tabella temporanea. Lo trovo dall'opzione "Genera script di modifica" ssms 2014. Script come questo. Da qui: come modificare l'ordine delle colonne in una tabella utilizzando la query 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

1

Se la tua tabella ha abbastanza colonne, puoi provare questo. Per prima cosa crea una nuova tabella con l'ordine preferito delle colonne.

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

Ora rilascia la tabella usando il comando drop

    drop table table_name;

ora rinomina la tabella appena creata con il tuo vecchio nome di tabella.

    rename new to table_name;

ora seleziona la tabella, hai riorganizzato le colonne come preferivi prima.

    select * from table_name;

È lo stesso che creare una nuova tabella, copiare i dati dalla tabella esistente a quella nuova, eliminare quella vecchia e rinominare quella nuova. Quindi, in senso stretto, questo non sta cambiando l'ordine delle colonne della tabella. Poiché questo crea / copia dalla vecchia tabella, ci vuole tempo per tabelle enormi. Ultimo ma non meno importante, la sintassi proposta non funziona in t-sql.
Jean-François

0

Alla fine della giornata, semplicemente non puoi farlo in MS SQL. Di recente ho creato tabelle in movimento (avvio dell'applicazione) utilizzando una procedura memorizzata che legge da una tabella di ricerca. Quando ho creato una vista che le combinava con un'altra tabella che avevo creato manualmente in precedenza (lo stesso schema, con i dati), non è riuscita, semplicemente perché stavo usando '' Seleziona * UNION Seleziona * 'per la vista. Allo stesso tempo, se utilizzo solo quelli creati tramite la stored procedure, ho successo.

In conclusione: se esiste un'applicazione che dipende dall'ordine delle colonne, non è davvero una buona programmazione e sicuramente creerà problemi in futuro. Le colonne dovrebbero "sentirsi" libere di essere ovunque e di essere utilizzate per qualsiasi processo di dati (INSERT, UPDATE, SELECT).


0

Puoi ottenerlo con questi passaggi:

  1. rimuovere tutte le chiavi esterne e la chiave primaria della tabella originale.

  2. rinomina la tabella originale.

  3. utilizzando CTAS creare la tabella originale nell'ordine desiderato.

  4. lascia cadere il vecchio tavolo.

  5. applicare tutti i vincoli alla tabella originale


0

Se le colonne da riordinare sono state create di recente e sono vuote, è possibile eliminare e aggiungere nuovamente le colonne nell'ordine corretto.

Questo è successo a me, estendendo manualmente un database per aggiungere nuove funzionalità, e avevo perso una colonna e quando l'ho aggiunta, la sequenza non era corretta.

Dopo aver trovato nessuna soluzione adeguata qui, ho semplicemente corretto la tabella utilizzando il seguente tipo di comandi.

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

Nota: fallo solo se non hai dati nelle colonne che stai eliminando.

La gente ha detto che l'ordine delle colonne non ha importanza. Uso regolarmente SQL Server Management Studio per "generare script" per creare una versione di testo dello schema di un database. Per controllare efficacemente la versione di questi script (git) e per confrontarli (WinMerge), è imperativo che l'output da database compatibili sia lo stesso e le differenze evidenziate siano autentiche differenze di database.

L'ordine delle colonne è importante; ma solo ad alcune persone, non a tutti!


0

Suppongo che tu voglia aggiungere una nuova colonna in una posizione specifica. È possibile creare una nuova colonna spostando le colonne correnti a destra.

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

Rimuovere tutti gli indici interessati e i riferimenti alle chiavi esterne. Aggiungi una nuova colonna con lo stesso identico tipo di dati dell'ultima colonna e copia i dati lì.

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

Cambia il tipo di dati della terza colonna nello stesso tipo della colonna precedente e copia i dati lì.

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

Rinomina le colonne di conseguenza, ricrea gli indici rimossi e i riferimenti alle chiavi esterne.

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

Modifica il tipo di dati della seconda colonna.

Tieni presente che l'ordine delle colonne è solo una cosa "cosmetica" come ha detto marc_s .


-1

Uso

SELECT * FROM TABLE1

che mostra l'ordine delle colonne predefinito della tabella.

Se vuoi cambiare l'ordine delle colonne.

Specificare il nome della colonna da visualizzare di conseguenza

SELECT COLUMN1, COLUMN5, COLUMN4, COLUMN3, COULMN2 FROM TABLE1

La domanda non riguarda l'ordinamento temporaneo. La domanda riguarda la struttura del design della tabella quando si modifica la tabella e si aggiungono nuove colonne.
vikas Chaturvedi

-1

puoi usare l'indicizzazione .. Dopo l'indicizzazione, se selezioni * da XXXX i risultati dovrebbero essere come per l'indice, ma solo il set di risultati .. non structrue della tabella


-1

Puoi cambiarlo usando la query SQL. Ecco la query sql per modificare la sequenza della colonna.

ALTER TABLE table name 
CHANGE COLUMN `column1` `column1` INT(11) NOT NULL COMMENT '' AFTER `column2`;

Mi chiedo se questo abbandona e ricrea la tabella come in SSMS. Ad ogni modo, non tirerei i dadi facendo questo su un DB di produzione, anche se questo metodo sembra interessante e merita di essere esaminato.
samis

Questa funzionalità non funziona in SQL Server come specificato dall'OP. Vorrei che lo facesse.
Bill

1
Questa è la sintassi di MySQL, non di SQL Server.
Jon Schneider

-1

Per avere un ordine di colonna specifico è necessario selezionare colonna per colonna nell'ordine desiderato. L'ordine di selezione determina come verranno ordinate le colonne nell'output.


-1

Prova questo comando:

alter table students modify age int(5) first; 

Questo cambierà la posizione dell'età alla prima posizione.


Questo non è un SQL valido in MSSQL. Forse MySQL o qualche altro dialetto, ma non per SQL Server 2005
nsimeonov

-2

altera il nome della tabella prima modifica il nome della colonna int (5); porterà la colonna a modificare prima il nome della tabella modificare il nome della colonna int (5) dopo (tablename);


-3

Esempio: modifica la posizione di field_priority dopo field_price nello stato della tabella.

ALTER TABLE `status` CHANGE `priority` `priority` INT(11) NULL DEFAULT NULL AFTER `price`;

2
Questa è la sintassi di MySQL, non di SQL Server.
Jon Schneider
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.