Kann ich Spalten in einer Tabelle logisch neu anordnen?

93

Kann ich steuern, wo die Spalte in Abfragen logisch angezeigt wird, wenn ich einer Tabelle in Microsoft SQL Server eine Spalte hinzufüge?

Ich möchte mich nicht mit dem physischen Layout von Spalten auf der Festplatte herumschlagen, aber ich möchte Spalten nach Möglichkeit logisch gruppieren, damit Tools wie SQL Server Management Studio den Inhalt der Tabelle auf bequeme Weise auflisten.

Ich weiß, dass ich dies über SQL Management Studio tun kann, indem ich in den "Entwurfs" -Modus für Tabellen gehe und die Reihenfolge der Spalten ziehe, aber ich möchte dies in Raw-SQL tun können, damit ich die Reihenfolge ausführen kann Skript über die Befehlszeile.

Fastcall
quelle
Für eine Antwort zu spät, aber schauen Sie sich diesen Link an. blog.sqlauthority.com/2013/03/11/…
sqluser
und eine andere verwandte Frage, ob es darauf ankommt stackoverflow.com/questions/6692021/…
Tim Abell
Microsoft Connect: ALTER TABLE-Syntax zum Ändern der Spaltenreihenfolge - Antwort ist wie üblich von der Schokoladen-Teekanne-Sorte WONTFIX
Tim Abell

Antworten:

77

Sie können dies nicht programmgesteuert (also auf sichere Weise) tun, ohne eine neue Tabelle zu erstellen.

Wenn Sie eine Neuordnung festlegen, erstellt Enterprise Manager eine neue Tabelle, verschiebt die Daten, löscht die alte Tabelle und benennt die neue Tabelle in den vorhandenen Namen um.

Wenn Sie Ihre Spalten in einer bestimmten Reihenfolge / Gruppierung haben möchten, ohne ihre physische Reihenfolge zu ändern, können Sie eine Ansicht erstellen, die beliebig sein kann.

vzczc
quelle
43

Ich denke, was jeder hier vermisst, ist, dass, obwohl nicht jeder mit 10er, 20er oder 1000er Instanzen desselben Softwaresystems zu tun hat, das im ganzen Land und auf der ganzen Welt installiert ist ... diejenigen von uns, die kommerziell verkaufte Software entwickeln, tun dies. Infolgedessen erweitern wir Systeme im Laufe der Zeit, erweitern Tabellen durch Hinzufügen von Feldern, wenn neue Funktionen erforderlich sind, und wenn diese Felder identifiziert werden, gehören sie zu einer vorhandenen Tabelle, und als solche über ein Jahrzehnt des Erweiterns, Wachsens, Hinzufügens von Feldern usw. zu Tabellen ... und dann mit diesen Tabellen arbeiten zu müssen, vom Entwurf über die Unterstützung bis hin zum Durchsuchen von Rohdaten / Fehlerbehebung, um neue Funktionsfehler zu beheben ... es ist unglaublich erschwerend, nicht die primären Informationen zu haben, die Sie möchten siehe in der ersten Handvoll Felder,

Ich habe mir oft gewünscht, ich könnte das aus genau diesem Grund tun. Aber ohne genau das zu tun, was SQL tut, ein Erstellungsskript für eine neue Tabelle so zu erstellen, wie ich es möchte, die Einfügung darauf zu schreiben, dann alle vorhandenen Einschränkungen, Beziehungen, Schlüssel, Indizes usw. usw. usw. aus der vorhandenen Tabelle zu entfernen und umzubenennen die "neue" Tabelle auf den alten Namen zurück und dann alle diese Schlüssel, Beziehungen, Index usw. usw. lesen ....

Ist nicht nur langweilig, zeitaufwändig, sondern ... muss in fünf weiteren Jahren wieder passieren ....

Es ist so nah dran, diese enorme Menge an Arbeit wert zu sein, aber der Punkt ist ... es wird nicht das letzte Mal sein, dass wir diese Fähigkeit brauchen, da unsere Systeme weiter wachsen, expandieren und Felder in einer verrückten Reihenfolge erhalten werden, die von angetrieben wird Bedarfs- / Design-Ergänzungen.

Die Mehrheit der Entwickler denkt von einem einzigen Systemstandpunkt aus, der einem einzelnen Unternehmen oder einem ganz bestimmten Hardbox-Markt dient.

Die "handelsüblichen", aber deutlich fortschrittlichen Designer und Entwicklungsleiter in ihrem Markt werden sich immer und immer wieder mit diesem Problem befassen müssen ... würden eine kreative Lösung lieben, wenn jemand eine hat. Dies könnte meinem Unternehmen leicht ein Dutzend Stunden pro Woche ersparen, da ich nicht darüber scrollen oder mich daran erinnern muss, wo sich "dieses" Feld in der Quelldatentabelle befindet.

Philip Coyner
quelle
Wir hatten das gleiche Problem und haben eine gespeicherte Prozedur erstellt, die diesen Prozess automatisiert (umbenennen, neue Tabelle erstellen, kopieren, alle Fremdschlüssel, Einschränkungen usw. neu erstellen). Sie müssen nur den Tabellennamen und die neue Reihenfolge der Spalten übergeben. Wenn dies Ihrem Unternehmen tatsächlich Dutzende von Stunden pro Woche ersparen könnte, sollten Sie die Zeit für das Schreiben eines ähnlichen Skripts investieren. Für uns dauerte es nur 2-3 Tage, um ein stabiles Skript zu haben, mit dem wir Spalten routinemäßig neu anordnen. Es kümmert sich um alle Funktionen, die wir in SqlServer verwenden (z. B. Teilindizes, indizierte Ansichten usw.) und besteht aus nur etwa 400 LOC.
Andreas
Ich weiß nicht, warum sie das Spaltenlayout nicht irgendwie abstrahieren können. Die Spalten müssen nicht physisch neu angeordnet werden! Die Menge an PHD-Level und darüber hinaus in Sql Server ist wirklich erstaunlich. Wenn Sie die Komplexität der Generierung von Abfrageplänen, die Statistik, die Indizierung und noch niemanden berücksichtigen, ist noch niemand aufgestanden und hat gesagt: „Erstellen wir einfach eine Tabelle, die die logische Reihenfolge darstellt. FieldID Guid, OrderBy int. Getan. Dann SSMS oder SELECT *nutzt das. Schalten Sie es aus, wenn Sie ein perfekter DBA sind und es nicht wollen. Sehr frustrierend. Und jetzt sind meine Tische groß genug, dass ich es nicht mehr brutal erzwingen kann.
Simon_Weaver
5

Wenn ich Ihre Frage verstehe, möchten Sie beeinflussen, welche Spalten in vorhandenen Abfragen zuerst, zweitens, drittens usw. zurückgegeben werden, oder?

Wenn alle Ihre Abfragen mit geschrieben wurden SELECT * FROM TABLE, werden sie in der Ausgabe angezeigt, wie sie in SQL angelegt sind.

Wenn Ihre Abfragen mit geschrieben werden, spielt SELECT Field1, Field2 FROM TABLEdie Reihenfolge, in der sie in SQL angeordnet sind, keine Rolle.

Otto
quelle
3

Wenn Management Studio dies tut, wird eine temporäre Tabelle erstellt, alles kopiert, die ursprüngliche Tabelle gelöscht und die temporäre Tabelle umbenannt. Es gibt keine einfache äquivalente T-SQL-Anweisung.

Wenn Sie das nicht möchten, können Sie jederzeit eine Ansicht der Tabelle mit den Spalten in der gewünschten Reihenfolge erstellen und diese verwenden.

Edit: geschlagen!

tags2k
quelle
1

Es gibt einen Weg, der jedoch nur vorübergehend für die Abfrage selbst gilt. Beispielsweise,

Nehmen wir an, Sie haben 5 Tische. Tabelle heißtT_Testing

Vorname, Nachname, Telefonnummer, E-Mail und Mitgliedsnummer

Sie möchten, dass die ID aufgelistet wird, dann Nachname, dann Vorname, dann Telefon und dann E-Mail.

Sie können dies gemäß Auswahl tun.

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

Wenn Sie aus irgendeinem Grund nur möchten, dass der Nachname vor dem Vornamen angezeigt wird, können Sie dies auch wie folgt tun:

Select LastName, *
From T_Testing

Das einzige, was Sie sicher sein möchten, ist, dass die OrderBy- oder Where-Funktion als Table.Column bezeichnet werden muss, wenn Sie ein Where oder OrderBy verwenden möchten

Beispiel:

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

Ich hoffe das hilft, ich habe es herausgefunden, weil ich das selbst machen musste.

Steven
quelle
In dieser Abfrage Wählen Sie Nachname, * Von T_Testing erhalten Sie zweimal Nachname.
sqluser
1
  1. Schreiben Sie Ihre vorhandene Tabelle in ein Abfragefenster.
  2. Führen Sie dieses Skript für eine Testdatenbank aus (entfernen Sie die Use-Anweisung).
  3. Verwenden Sie SSMS, um die erforderlichen Spaltenänderungen vorzunehmen
  4. Klicken Sie auf Änderungsskript generieren (standardmäßig das Symbol ganz links und ganz unten in der Schaltflächenleiste).
  5. Verwenden Sie dieses Skript für Ihre reale Tabelle

Alles, was das Skript wirklich tut, ist, eine zweite Tabellentabelle mit den gewünschten Spaltenreihenfolgen zu erstellen, alle Ihre Daten darin zu kopieren, die ursprüngliche Tabelle zu löschen und dann die sekundäre Tabelle umzubenennen, um ihren Platz einzunehmen. Dies erspart Ihnen jedoch das Schreiben selbst, falls Sie ein Bereitstellungsskript benötigen.

Paul
quelle
0

Es ist nicht möglich, die Reihenfolge der Spalten zu ändern, ohne die gesamte Tabelle neu zu erstellen. Wenn Sie nur wenige Instanzen der Datenbank haben, können Sie hierfür SSMS verwenden (Wählen Sie die Tabelle aus und klicken Sie auf "Design").

Wenn Sie zu viele Instanzen für einen manuellen Prozess haben, sollten Sie dieses Skript ausprobieren: https://github.com/Epaminaidos/reorder-columns

Andreas
quelle