Posso riordinare logicamente le colonne in una tabella?


93

Se sto aggiungendo una colonna a una tabella in Microsoft SQL Server, posso controllare dove la colonna viene visualizzata logicamente nelle query?

Non voglio fare confusione con il layout fisico delle colonne sul disco, ma vorrei raggruppare logicamente le colonne quando possibile in modo che strumenti come SQL Server Management Studio elencino il contenuto della tabella in modo conveniente.

So di poterlo fare tramite SQL Management Studio entrando nella loro modalità di "progettazione" per le tabelle e trascinando l'ordine delle colonne, ma mi piacerebbe poterlo fare in SQL grezzo in modo da poter eseguire l'ordinamento script dalla riga di comando.


Troppo tardi per una risposta, ma dai un'occhiata a questo link. blog.sqlauthority.com/2013/03/11/…
sqluser



e un'altra domanda correlata, sull'importanza di stackoverflow.com/questions/6692021/…
Tim Abell

microsoft connect: sintassi ALTER TABLE per modificare l'ordine delle colonne - la risposta è del tipo di teiera di cioccolato come al solito WONTFIX
Tim Abell

Risposte:


77

Non puoi farlo in modo programmatico (in un modo sicuro che è) senza creare una nuova tabella.

Ciò che Enterprise Manager fa quando si esegue il commit di un riordino è creare una nuova tabella, spostare i dati, quindi eliminare la vecchia tabella e rinominare la nuova tabella con il nome esistente.

Se desideri che le tue colonne siano in un ordine / raggruppamento particolare senza alterarne l'ordine fisico, puoi creare una visualizzazione che può essere quella che desideri.


43

Penso che quello che manca a tutti qui è che, sebbene non tutti abbiano a che fare con istanze di 10, 20 o 1000 dello stesso sistema software installato in tutto il paese e nel mondo ... quelli di noi che progettano software venduto commercialmente lo fanno. Di conseguenza, espandiamo i sistemi nel tempo, espandiamo le tabelle aggiungendo campi quando è necessaria una nuova capacità e quando questi campi vengono identificati appartengono a una tabella esistente e, come tale, oltre un decennio di espansione, crescita, aggiunta di campi, ecc. alle tabelle ... e poi dover lavorare con quelle tabelle dalla progettazione, al supporto, a volte scavare nei dati grezzi / risoluzione dei problemi per eseguire il debug di nuovi bug di funzionalità ... è incredibilmente irritante non avere le informazioni primarie che desideri vedere entro la prima manciata di campi,

Ho spesso desiderato di poterlo fare, proprio per questo motivo. Ma a meno di fare esattamente ciò che fa SQL, costruire uno script di creazione per una nuova tabella nel modo desiderato, scrivere l'inserto in esso, quindi eliminare tutti i vincoli, le relazioni, le chiavi, gli indici, ecc. Ecc. Esistenti dalla tabella esistente e rinominare la "nuova" tabella torna al vecchio nome, quindi legge tutte quelle chiavi, relazioni, indice, ecc. ecc ....

Non è solo noioso, richiede tempo ma ... tra altri cinque anni, dovrà accadere di nuovo ...

È così vicino a valere quell'enorme quantità di lavoro, tuttavia il punto è ... non sarà l'ultima volta che avremo bisogno di questa capacità, poiché i nostri sistemi continueranno a crescere, espandersi e ottenere campi in un ordine stravagante guidato da necessità / aggiunte di design.

La maggior parte degli sviluppatori pensa da un unico punto di vista del sistema che serve una singola azienda o un mercato di hard box molto specifico.

I designer e leader di sviluppo "off-the-shelf" ma significativamente progressisti nel loro spazio di mercato dovranno sempre affrontare questo problema, ancora e ancora ..... amerebbero una soluzione creativa se qualcuno ne ha una. Questo potrebbe facilmente far risparmiare alla mia azienda una dozzina di ore a settimana, semplicemente non dovendo scorrere o ricordare dove si trova "quel" campo nella tabella dei dati di origine ....


Abbiamo avuto lo stesso problema e abbiamo creato una stored procedure che automatizza questo processo (rinomina, crea una nuova tabella, copia, ricrea tutte le chiavi esterne, i vincoli, ecc.). Devi solo passare il tablename e il nuovo ordine delle colonne. Se questo potesse effettivamente far risparmiare alla tua azienda dozzine di ore a settimana, dovresti investire il tempo per scrivere uno script simile. Per noi, ci sono voluti solo 2-3 giorni per avere uno script stabile che usiamo abitualmente per riordinare le colonne. Si prende cura di tutte le funzionalità che usiamo in SqlServer (ad es. Indici parziali, viste indicizzate, ecc.) E consiste solo di circa 400 LOC.
Andreas

Non so perché non possano astrarre in qualche modo il layout delle colonne. Non è necessario riordinare fisicamente le colonne! La quantità di livello di PHD e oltre l'ingegneria in Sql Server è davvero sorprendente. Quando si considera la complessità della generazione del piano di query, le statistiche, l'indicizzazione e nessuno si è ancora alzato e ha detto 'Facciamo solo una tabella che rappresenti l'ordine LOGICO. FieldID Guid, OrderBy int. Fatto. Quindi SSMS o SELECT *usa quello. Spegnilo se sei un DBA perfetto e non lo vuoi. Molto frustrante. E ora i miei tavoli sono abbastanza grandi che non posso più forzarli.
Simon_Weaver

So che questo è un vecchio commento, ma Visual Studio all'interno del progetto di database crea automaticamente uno script SQL per il riordino delle colonne fisiche quando si modifica lo schema della tabella e si preme la pubblicazione.
Muflix

5

Se capisco la tua domanda, vuoi influenzare le colonne che vengono restituite per prime, seconde, terze e così via nelle query esistenti , giusto?

Se tutte le tue query sono scritte con SELECT * FROM TABLE- allora appariranno nell'output così come sono disposte in SQL.

Se le tue query sono scritte con SELECT Field1, Field2 FROM TABLE, l'ordine in cui sono disposte in SQL non ha importanza.


3

Quando Management Studio lo fa, crea una tabella temporanea, copia tutto, rilascia la tabella originale e rinomina la tabella temporanea. Non esiste una semplice istruzione T-SQL equivalente.

Se non ti va di farlo, puoi sempre creare una vista della tabella con le colonne nell'ordine che desideri e usarlo?

Modifica: battuto!


1

C'è un modo, ma è solo temporaneamente per la query stessa. Per esempio,

Diciamo che hai 5 tavoli. La tabella è chiamataT_Testing

FirstName, LastName, PhoneNumber, Email e Member_ID

vuoi che indichi il loro ID, quindi il cognome, quindi il nome, quindi il telefono e poi l'e-mail.

Puoi farlo secondo il Select.

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

Oltre a questo, se vuoi solo che il cognome venga mostrato prima del nome per qualche motivo, puoi farlo anche come segue:

Select LastName, *
From T_Testing

L'unica cosa che vuoi essere sicuro di fare è che la funzione OrderBy o Where deve essere indicata come Table.Column se intendi utilizzare Where o OrderBy

Esempio:

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

Spero che questo aiuti, l'ho capito perché dovevo farlo da solo.


In questa query selezionare LastName, * Da T_Testing, ottieni LastName due volte.
sqluser

1
  1. Script la tua tabella esistente in una finestra di query.
  2. Esegui questo script su un database di test (rimuovi l'istruzione Use)
  3. Usa SSMS per apportare le modifiche di colonna necessarie
  4. Fare clic su Genera script di modifica (icona più a sinistra e più in basso sulla barra dei pulsanti, per impostazione predefinita)
  5. Usa questo script contro il tuo tavolo reale

Tutto ciò che lo script fa è creare una seconda tabella con gli ordini di colonna desiderati, copiare tutti i dati al suo interno, rilasciare la tabella originale e quindi rinominare la tabella secondaria per sostituirla. Ciò ti evita di scriverlo da solo, anche se vuoi uno script di distribuzione.



0

Non è possibile modificare l'ordine delle colonne senza ricreare l'intera tabella. Se si dispone solo di poche istanze del database, è possibile utilizzare SSMS per questo (selezionare la tabella e fare clic su "struttura").

Nel caso in cui tu abbia troppe istanze per un processo manuale, dovresti provare questo script: https://github.com/Epaminaidos/reorder-columns

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.