Wie ändere ich die Spaltenreihenfolge in einer Tabelle mithilfe der SQL-Abfrage in SQL Server 2005?


109

Wie ändere ich die Spaltenreihenfolge in einer Tabelle mithilfe der SQL-Abfrage in SQL Server 2005?

Ich möchte die Spaltenreihenfolge in einer Tabelle mithilfe der SQL-Abfrage neu anordnen.


3
Wenn Sie die Position der Spalten in der Tabelle ändern möchten, müssen Sie eine neue Tabelle mit der bevorzugten Reihenfolge erstellen, die Daten aus der alten Tabelle einfügen und dann die ursprüngliche Tabelle löschen. Es gibt meines Wissens keinen anderen Weg, dies zu tun.
Michael Todd

Sprechen Sie über die Spaltenreihenfolge in einer SELECT-Anweisung oder die Spaltenreihenfolge in der Tabellendefinition?
marc_s

Antworten:


111

Du kannst nicht. Die Spaltenreihenfolge ist nur eine "kosmetische" Sache, die uns Menschen wichtig ist - für SQL Server ist sie fast immer absolut irrelevant.

Was SQL Server Management Studio im Hintergrund tut, wenn Sie die Spaltenreihenfolge ändern, besteht darin, die Tabelle mit einem neuen CREATE TABLEBefehl von Grund auf neu zu erstellen, die Daten aus der alten Tabelle zu kopieren und sie dann zu löschen.

Es gibt keinen SQL-Befehl zum Definieren der Spaltenreihenfolge.


4
Nein, so etwas gibt es in SQL Server nicht - und sollte auch nicht in einem echten RBDMS enthalten sein - die Spaltenreihenfolge ist kein Konzept, das für eine SQL-Tabelle relevant ist
marc_s

68
@marc_s Es gibt keinen guten Grund gegen die Unterstützung der Spaltenreihenfolge. Auch wenn es nur visuell ist. Es kann einfach einfacher sein, die Daten in einer Tabelle mit einer bestimmten Spaltenreihenfolge anzuzeigen, wenn Sie ein "SELECT *" vornehmen. Ich bin Entwickler und mache diese Art von Abfragen die ganze Zeit. Mit einer vordefinierten Spaltenreihenfolge können Sie etwas Zeit sparen. Von jedem anderen Standpunkt aus hat es natürlich keinen Sinn: Nichts sollte von der Spaltenreihenfolge abhängen. Übrigens gibt es eine ORDINAL_POSITION-Spalte, wenn Sie "INFORMATION_SCHEMA.COLUMNS" abfragen. Ich weiß nicht was es bedeutet ... aber es muss etwas damit zu tun haben.
JotaBe

18
Die Spaltenreihenfolge ist beispielsweise bei Verwendung von INSERT INTO ohne Angabe von Spaltennamen relevant. Ein weiteres Beispiel ist der ORDER BY-Spaltenindex anstelle des Spaltennamens. Beides wird offensichtlich nicht empfohlen, aber SQL Server erlaubt es, sodass jemand es möglicherweise irgendwo verwendet hat und möglicherweise den T-SQL-Code beim Ändern der Spaltenreihenfolge beschädigt.
Carvellis

12
@Carvelis: Sie sollten NIEMALS verwenden, INSERTohne Ihre Spalten explizit anzugeben!
marc_s

2
@marc_s: absolut, aber ich bin normalerweise nicht der einzige, der an einem Projekt arbeitet. Ich habe einige Projekte gesehen, in denen Leute diese Art von Code verwendet haben.
Carvellis

30

Sie müssen die Felder explizit in der Reihenfolge auflisten, in der sie zurückgegeben werden sollen, anstatt * für die 'Standard'-Reihenfolge zu verwenden.

ursprüngliche Abfrage:

select * from foobar

kehrt zurück

foo bar
--- ---
  1   2

schreibe jetzt

select bar, foo from foobar

bar foo
--- ---
  2   1

Die obige Antwort ist falsch, nicht wahr? Diese Antwort zeigt buchstäblich, wie die Spalten bestellt werden. Warum hat die vorherige ein Häkchen und diese nicht?
Agent Lu

1
@ Agent Lu Das Problem ist der Wortlaut der ursprünglichen Frage. Marc und ich haben die Frage des OP nach "Änderung der Reihenfolge der Spalten" unterschiedlich interpretiert. Er macht ein starkes Argument dafür, warum die Spaltenreihenfolge in der gespeicherten Tabelle irrelevant ist (Namen sind jedoch). Ich habe gezeigt, wie Daten in einer anderen Spaltenreihenfolge extrahiert werden können. Gar nicht das Gleiche!
Lexu

23

gemäß http://msdn.microsoft.com/en-us/library/aa337556.aspx

Diese Aufgabe wird mit Transact-SQL-Anweisungen nicht unterstützt.

Nun, es kann mit create/ copy / drop/ rename gemacht werden , wie von komma8.komma1 beantwortet

Oder Sie können SQL Server Management Studio verwenden

  1. Klicken Sie im Objekt-Explorer mit der rechten Maustaste auf die Tabelle mit den Spalten, die Sie neu anordnen möchten, und klicken Sie auf Design (Ändern in Version 2005 SP1 oder früher).
  2. Aktivieren Sie das Feld links neben dem Spaltennamen, den Sie neu anordnen möchten. (Sie können mehrere Spalten auswählen, indem Sie die Tasten [Umschalt] oder [Strg] auf Ihrer Tastatur gedrückt halten.)
  3. Ziehen Sie die Spalte (n) an eine andere Stelle in der Tabelle.

Klicken Sie dann auf Speichern. Diese Methode löscht die Tabelle tatsächlich und erstellt sie neu, sodass einige Fehler auftreten können.

Wenn die Option Änderungsverfolgung für die Datenbank und die Tabelle aktiviert ist, sollten Sie diese Methode nicht verwenden.

Wenn diese Option deaktiviert ist, sollte die Option Änderungen am Speichern verhindern, für die die Tabelle neu erstellt werden muss, im Menü Extras> Optionen> Designer deaktiviert werden. Andernfalls tritt der Fehler "Speichern von Änderungen ist nicht zulässig" auf.

  • Das Deaktivieren der Option " Speichern von Änderungen verhindern", für die die Option zum erneuten Erstellen von Tabellen erforderlich ist, wird von Microsoft dringend empfohlen, da die vorhandenen Änderungsverfolgungsinformationen beim erneuten Erstellen der Tabelle gelöscht werden. Sie sollten diese Option daher niemals deaktivieren, wenn die Änderungsverfolgung aktiviert ist aktiviert!

Probleme können auch bei der Erstellung von Primär- und Fremdschlüsseln auftreten.

Wenn einer der oben genannten Fehler auftritt, schlägt das Speichern fehl, sodass Sie die ursprüngliche Spaltenreihenfolge beibehalten.


1
Die Aussage " This task cannot be performed using Transact-SQL statements." im Dokument war falsch. Ich erklärte den Autor und bat ihn, es in " This task is not supported using Transact-SQL statements." zu ändern . Vor ungefähr einem Tag stimmte der Autor zu und das Dokument wurde repariert. Sie können die Diskussion auf GitHub verfolgen .
Ronen Ariely

@RonenAriely gute Arbeit, und danke, dass Sie mich wissen lassen. Ich habe meine Antwort aktualisiert
robotik

Gern geschehen @robotik 😀. Ich hoffe, dass alle, die hierher kommen und die Antwort mit den meisten Stimmen sehen, verstehen, dass es ein totaler Fehler ist. Leider verhalten sich Communities normalerweise wie eine Herde (Vieh), und sobald ein Anführer und ein Top-Mitarbeiter (der als Top-Experte gilt) in der Community einen Fehler gemacht haben, folgen ihm andere, wie in diesem Thread geschehen. Die Leute stimmen weiterhin für einen Fehler, wenn er bereits viele Stimmen hat (der Ansatz von: "Da jeder das sagt, dann ist es wahr"), und andere Leute, die ins Forum kommen, werden denken, dass dies die richtige Antwort ist.
Ronen Ariely

1
@ RonAriely deshalb scrolle ich immer nach unten :)
Robotik

13

Dies ähnelt der Frage zum Bestellen der Datensätze im Ergebnis einer Abfrage. Normalerweise mag niemand die formal korrekte Antwort ;-)

Also los geht's:

  • Gemäß SQL-Standard sind die Spalten in einer Tabelle nicht "geordnet".
  • Infolgedessen select *erzwingt a nicht, dass die Spalten in einer bestimmten Reihenfolge zurückgegeben werden
  • In der Regel hat jedes RDBMS eine Art "Standard" -Reihenfolge (normalerweise die Reihenfolge, in der die Spalten zur Tabelle hinzugefügt wurden, entweder in den create table' or in theAnweisungen "alter table add")
  • Wenn Sie sich daher auf die Reihenfolge der Spalten verlassen (da Sie die Ergebnisse einer Abfrage verwenden, um eine andere Datenstruktur aus der Position der Spalten zu entfernen), listen Sie die Spalten explizit in der gewünschten Reihenfolge auf.

11

Sie können natürlich die Reihenfolge der Spalten in einer SQL-Anweisung ändern. Wenn Sie jedoch die physische Spaltenreihenfolge von Tabellen abstrahieren möchten, können Sie eine Ansicht erstellen. dh

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

Ändert dies die Abfragezeit?
Blindguy

@blindguy nein, es ändert nicht Ihre
Abfragezeit

9

In SQLServer Management Studio:

Extras -> Optionen -> Designer -> Tabellen- und Datenbankdesigner

  • Deaktivieren Sie "Speichern von Änderungen verhindern, die eine Neuerstellung der Tabelle erfordern".

Dann:

  • Klicken Sie mit der rechten Maustaste auf die Tabelle, für die Sie die Spalten neu anordnen möchten.
  • Klicken Sie auf "Design".
  • Ziehen Sie die Spalten in die gewünschte Reihenfolge.
  • Klicken Sie abschließend auf Speichern.

SQLServer Management Studio löscht die Tabelle und erstellt sie anhand der Daten neu.


6

Sie können dies tun, indem Sie eine neue Tabelle erstellen, alle Daten kopieren, die alte Tabelle löschen und dann die neue umbenennen, um die alte zu ersetzen.

Sie können der Tabelle auch neue Spalten hinzufügen, die spaltenweisen Daten kopieren, die alten Spalten löschen und dann neue Spalten umbenennen, um sie an die alten anzupassen. Ein einfaches Beispiel unten: 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
Ich habe eine gespeicherte Prozedur geschrieben, die etwas Ähnliches macht. Es automatisiert die Neuerstellung von Tabellen mithilfe von dynamischem SQL. caseyplummer.wordpress.com/2013/07/22/…
Casey Plummer

6

In SQLServer Management Studio:

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

Auswahl aufheben Prevent saving changes that require table re-creation.

Jetzt können Sie die Tabelle neu anordnen.


2

SQL Server erstellt das Skript intern. Es erstellt eine temporäre Tabelle mit neuen Änderungen, kopiert die Daten und löscht die aktuelle Tabelle. Anschließend wird die Tabelleneinfügung aus der temporären Tabelle neu erstellt. Ich finde es aus der Option "Änderungsskript generieren" ssms 2014. Skript wie dieses. Von hier aus: So ändern Sie die Spaltenreihenfolge in einer Tabelle mithilfe der SQL-Abfrage

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

Wenn Ihre Tabelle genügend Spalten enthält, können Sie dies versuchen. Erstellen Sie zunächst eine neue Tabelle mit der bevorzugten Reihenfolge der Spalten.

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

Löschen Sie nun die Tabelle mit dem Befehl drop

    drop table table_name;

Benennen Sie nun die neu erstellte Tabelle in Ihren alten Tabellennamen um.

    rename new to table_name;

Wählen Sie nun die Tabelle aus, und Sie haben Ihre Spalten nach Ihren Wünschen neu angeordnet.

    select * from table_name;

Dies entspricht dem Erstellen einer neuen Tabelle, dem Kopieren von Daten aus der vorhandenen Tabelle in die neue, dem Löschen der alten und dem Umbenennen der neuen Tabelle. Genau genommen ändert dies nichts an der Spaltenreihenfolge der Tabelle. Da dies aus der alten Tabelle erstellt / kopiert wird, dauert es einige Zeit für große Tabellen. Last but not least funktioniert die vorgeschlagene Syntax in t-sql nicht.
Jean-François

0

Letztendlich können Sie dies in MS SQL einfach nicht tun. Ich habe kürzlich Tabellen unterwegs (Anwendungsstart) mit einer gespeicherten Prozedur erstellt, die aus einer Nachschlagetabelle liest. Als ich eine Ansicht erstellte, die diese mit einer anderen Tabelle kombinierte, die ich zuvor manuell erstellt hatte (dasselbe Schema mit Daten), schlug dies fehl - einfach, weil ich '' Select * UNION Select * '' für die Ansicht verwendete. Wenn ich nur diejenigen verwende, die über die gespeicherte Prozedur erstellt wurden, bin ich gleichzeitig erfolgreich.

Fazit: Wenn es eine Anwendung gibt, die von der Reihenfolge der Spalten abhängt, ist dies wirklich keine gute Programmierung und wird mit Sicherheit in Zukunft Probleme verursachen. Spalten sollten sich frei fühlen, überall zu sein und für jeden Datenprozess (INSERT, UPDATE, SELECT) verwendet zu werden.


0

Sie können dies mit folgenden Schritten erreichen:

  1. Entfernen Sie alle Fremdschlüssel und Primärschlüssel der Originaltabelle.

  2. Benennen Sie die ursprüngliche Tabelle um.

  3. Erstellen Sie mit CTAS die Originaltabelle in der gewünschten Reihenfolge.

  4. Lass den alten Tisch fallen.

  5. Wenden Sie alle Einschränkungen wieder auf die ursprüngliche Tabelle an


0

Wenn die neu zu ordnenden Spalten kürzlich erstellt wurden und leer sind, können die Spalten gelöscht und in der richtigen Reihenfolge wieder hinzugefügt werden.

Dies geschah mir, als ich eine Datenbank manuell erweiterte, um neue Funktionen hinzuzufügen, und ich hatte eine Spalte verpasst, und als ich sie hinzufügte, war die Reihenfolge falsch.

Nachdem ich hier keine adäquate Lösung gefunden hatte, korrigierte ich die Tabelle einfach mit den folgenden Befehlen.

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

Hinweis: Tun Sie dies nur, wenn Sie keine Daten in den Spalten haben, die Sie löschen.

Die Leute haben gesagt, dass die Spaltenreihenfolge keine Rolle spielt. Ich verwende regelmäßig SQL Server Management Studio "Skripte generieren", um eine Textversion des Schemas einer Datenbank zu erstellen. Um die Versionskontrolle dieser Skripte (git) effektiv durchzuführen und sie zu vergleichen (WinMerge), ist es unbedingt erforderlich, dass die Ausgabe kompatibler Datenbanken gleich ist und die hervorgehobenen Unterschiede echte Datenbankunterschiede sind.

Die Spaltenreihenfolge spielt eine Rolle. aber nur für einige Leute, nicht für alle!


0

Ich nehme an, Sie möchten an einer bestimmten Position eine neue Spalte hinzufügen. Sie können eine neue Spalte erstellen, indem Sie die aktuellen Spalten nach rechts verschieben.

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

Entfernen Sie alle betroffenen Indizes und Fremdschlüsselreferenzen. Fügen Sie eine neue Spalte mit genau demselben Datentyp wie die letzte Spalte hinzu und kopieren Sie die Daten dort.

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

Ändern Sie den Datentyp der dritten Spalte in den gleichen Typ wie in der vorherigen Spalte und kopieren Sie die Daten dort.

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

Benennen Sie die Spalten entsprechend um, erstellen Sie entfernte Indizes und Fremdschlüsselreferenzen neu.

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

Ändern Sie den Datentyp der zweiten Spalte.

Denken Sie daran, dass die Spaltenreihenfolge nur eine "kosmetische" Sache ist, wie marc_s sagte .


-1

Verwenden

SELECT * FROM TABLE1

Hier wird die Standardspaltenreihenfolge der Tabelle angezeigt.

Wenn Sie die Reihenfolge der Spalten ändern möchten.

Geben Sie den Spaltennamen an, der entsprechend angezeigt werden soll

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

Die Frage betrifft nicht die vorübergehende Bestellung. Die Frage bezieht sich auf die Struktur des Tabellenentwurfs, wenn Sie eine Tabelle ändern und neue Spalten hinzufügen.
Vikas Chaturvedi

-1

Sie können die Indizierung verwenden. Wenn Sie nach der Indizierung * aus XXXX auswählen, sollten die Ergebnisse dem Index entsprechen, aber nur die Ergebnismenge. Nicht die Struktur der Tabelle


-1

Sie können dies mithilfe der SQL-Abfrage ändern. Hier ist eine SQL-Abfrage, um die Reihenfolge der Spalten zu ändern.

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

Ich frage mich, ob dies die Tabelle wie in SSMS löscht und neu erstellt. In beiden Fällen würde ich nicht auf einer Produktions-DB würfeln, obwohl diese Methode interessant und einen Blick wert erscheint.
Samis

Diese Funktionalität funktioniert in SQL Server nicht wie vom OP angegeben. Ich wünschte, es wäre so.
Bill

1
Dies ist die MySQL-Syntax, nicht SQL Server.
Jon Schneider

-1

Um eine bestimmte Spaltenreihenfolge zu haben, müssen Sie Spalte für Spalte in der gewünschten Reihenfolge auswählen. Die Auswahlreihenfolge bestimmt, wie die Spalten in der Ausgabe sortiert werden.


-1

Versuchen Sie diesen Befehl:

alter table students modify age int(5) first; 

Dadurch wird die Altersposition auf die erste Position geändert.


Dies ist kein gültiges SQL in MSSQL. Vielleicht MySQL oder ein anderer Dialekt, aber nicht für SQL Server 2005
nsimeonov

-2

Tabellenname ändern Spaltenname ändern int (5) zuerst; bringt die Spalte zum ersten Ändern des Tabellennamens Ändern des Spaltennamens int (5) nach (Tabellenname);


-3

Beispiel: Ändern Sie die Position von field_priority nach field_price im Tabellenstatus.

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

2
Dies ist die MySQL-Syntax, nicht SQL Server.
Jon Schneider
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.