Jak zmienić kolejność kolumn w tabeli za pomocą zapytania sql w SQL Server 2005?


109

Jak zmienić kolejność kolumn w tabeli za pomocą zapytania SQL w programie SQL Server 2005?

Chcę zmienić kolejność kolumn w tabeli za pomocą zapytania SQL.


3
Jeśli odnosisz się do zmiany pozycji kolumn istniejących w tabeli, musisz utworzyć nową tabelę z preferowaną kolejnością, wstawić dane ze starej tabeli, a następnie usunąć oryginalną tabelę. Nie ma innego sposobu (o ile wiem), aby to zrobić.
Michael Todd

Czy mówisz o kolejności kolumn w instrukcji SELECT czy o kolejności kolumn w definicji tabeli?
marc_s

Odpowiedzi:


112

Nie możesz. Kolejność kolumn to tylko „kosmetyczna” rzecz, na której nam zależy - dla SQL Server jest prawie zawsze zupełnie nieistotna.

To, co SQL Server Management Studio robi w tle, gdy zmieniasz kolejność kolumn, polega na odtworzeniu tabeli od podstaw za pomocą nowego CREATE TABLEpolecenia, skopiowaniu danych ze starej tabeli, a następnie upuszczeniu jej.

Nie ma polecenia SQL definiującego kolejność kolumn.


4
Nie, nie ma czegoś takiego jak SQL Server - i nie powinno być w żadnym prawdziwym RBDMS - kolejność kolumn nie jest pojęciem odnoszącym się do tabeli SQL
marc_s

68
@marc_s Nie ma dobrego powodu, by nie wspierać kolejności kolumn. Nawet jeśli to tylko wizualne. Po prostu może ułatwić przeglądanie danych w tabeli z podaną kolejnością kolumn po wykonaniu polecenia „SELECT *”. Jestem programistą i cały czas wykonuję tego rodzaju zapytania. Możesz poświęcić trochę czasu dzięki dobrze zdefiniowanej kolejności kolumn. Z innego punktu widzenia nie ma to oczywiście sensu: nic nie powinno zależeć od kolejności kolumn. Nawiasem mówiąc, istnieje kolumna ORDINAL_POSITION, gdy pytasz „INFORMATION_SCHEMA.COLUMNS”. Nie wiem, co to znaczy ... ale to musi mieć z tym coś wspólnego.
JotaBe

18
Kolejność kolumn jest istotna, na przykład, gdy używasz INSERT INTO bez określania nazw kolumn. Innym przykładem jest ORDER BY indeks kolumny zamiast nazwy kolumny. Obie oczywiście nie są zalecane praktyki, ale SQL Server na to pozwala, więc ktoś mógł go gdzieś użyć, prawdopodobnie łamiąc kod T-SQL podczas zmiany kolejności kolumn.
Carvellis,

12
@Carvelis: NIGDY nie powinieneś używać INSERTbez wyraźnego określenia kolumn!
marc_s

2
@marc_s: absolutnie, ale zwykle nie tylko ja pracuję nad projektem. Widziałem sporo projektów, w których ludzie używali tego rodzaju kodu.
Carvellis,

30

Musisz jawnie wymienić pola w takiej kolejności, w jakiej mają być zwracane, zamiast używać * dla zamówienia „domyślnego”.

oryginalne zapytanie:

select * from foobar

zwroty

foo bar
--- ---
  1   2

teraz pisz

select bar, foo from foobar

bar foo
--- ---
  2   1

Powyższa odpowiedź jest nieprawidłowa, prawda? Ta odpowiedź dosłownie pokazuje, jak uporządkować kolumny, dlaczego poprzednia ma znacznik wyboru, a ta nie?
Agent Lu,

1
@Agent Lu Problemem jest sformułowanie pierwotnego pytania. Marc i ja zinterpretowaliśmy inaczej pytanie PO dotyczące „zmiany kolejności kolumn”. Mocno argumentuje, dlaczego kolejność kolumn w przechowywanej tabeli nie ma znaczenia (chociaż nazwy są). Pokazałem, jak można wyodrębnić dane w innej kolejności kolumn. Wcale nie to samo!
lexu

23

według http://msdn.microsoft.com/en-us/library/aa337556.aspx

To zadanie nie jest obsługiwane przy użyciu instrukcji języka Transact-SQL.

Cóż, można to zrobić, używając create/ copy / drop/ rename, zgodnie z odpowiedzią komma8.komma1

Lub możesz użyć SQL Server Management Studio

  1. W Eksploratorze obiektów kliknij prawym przyciskiem myszy tabelę z kolumnami, których kolejność chcesz zmienić, i kliknij opcję Projekt (Modyfikuj w wersji 2005 SP1 lub starszej)
  2. Zaznacz pole po lewej stronie nazwy kolumny, którą chcesz zmienić. (Możesz zaznaczyć wiele kolumn, przytrzymując klawisze [shift] lub [ctrl] na klawiaturze).
  3. Przeciągnij kolumny w inne miejsce w tabeli.

Następnie kliknij Zapisz. Ta metoda faktycznie usuwa i odtwarza tabelę, więc mogą wystąpić błędy.

Jeśli opcja śledzenia zmian jest włączona dla bazy danych i tabeli, nie należy używać tej metody.

Jeśli jest wyłączona, opcja Zapobiegaj zapisywaniu zmian, które wymagają ponownego utworzenia tabeli, powinna być wyczyszczona w menu Narzędzia> Opcje> Projektanci, w przeciwnym razie wystąpi błąd „Zapisywanie zmian jest niedozwolone” .

  • Wyłączenie opcji Zapobiegaj zapisywaniu zmian, które wymagają ponownego utworzenia tabeli, jest stanowczo odradzane przez firmę Microsoft, ponieważ prowadzi to do usunięcia istniejących informacji o śledzeniu zmian podczas ponownego tworzenia tabeli, dlatego nigdy nie należy wyłączać tej opcji, jeśli opcja Śledzenie zmian jest włączone!

Problemy mogą również wystąpić podczas tworzenia klucza podstawowego i obcego.

Jeśli wystąpi którykolwiek z powyższych błędów, zapisywanie się nie powiedzie, co pozostawi oryginalną kolejność kolumn.


1
Oświadczenie „ This task cannot be performed using Transact-SQL statements.” w dokumencie było błędne. Wyjaśniłem autorowi i poprosiłem go, aby zmienił to na „ This task is not supported using Transact-SQL statements.”. Około dnia temu autor zgodził się i dokument został naprawiony. Możesz śledzić dyskusję, którą mieliśmy na GitHub .
Ronen Ariely

@RonenAriely dobra robota i dzięki za poinformowanie mnie. Zaktualizowałem moją odpowiedź
robotik

Serdecznie zapraszamy @robotik 😀. Mam nadzieję, że wszyscy, którzy tu przybędą i zobaczą odpowiedź z największą liczbą głosów, zrozumieją, że to totalny błąd. Niestety, społeczności zwykle zachowują się jak stado (bydło) i gdy lider i czołowy współpracownik (który jest uważany za najlepszego eksperta) popełnili błąd, inni podążają za nim, jak to było w tym wątku. Ludzie nadal będą głosować za błąd, jeśli dostał już wiele głosów (podejście: „skoro wszyscy tak mówią, to to prawda”), a inne osoby, które przyjdą na forum, pomyślą, że to jest poprawna odpowiedź.
Ronen Ariely

1
@RonenAriely dlatego zawsze przewijam w dół :)
robotik

13

Jest to podobne do pytania o porządkowanie rekordów w wyniku zapytania .. i zazwyczaj nikt nie lubi formalnie poprawnej odpowiedzi ;-)

Więc oto idzie:

  • zgodnie ze standardem SQL kolumny w tabeli nie są „uporządkowane”
  • w rezultacie a select *nie wymusza zwrócenia kolumn w określonej kolejności
  • zazwyczaj każdy RDBMS ma rodzaj "domyślnej" kolejności (zwykle kolejność, w jakiej kolumny zostały dodane do tabeli, albo w create table' or in thetablicy alter add `instrukcje
  • w związku z tym, jeśli polegasz na kolejności kolumn (ponieważ używasz wyników kwerendy do wyodrębnienia innej struktury danych z pozycji kolumn), jawnie wymień kolumny w żądanej kolejności.

11

Możesz oczywiście zmienić kolejność kolumn w instrukcji sql. Jeśli jednak chcesz wyodrębnić fizyczną kolejność kolumn tabel, możesz utworzyć widok. to znaczy

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

czy to zmienia czas zapytania?
blindguy

@blindguy no, to nie zmienia czasu zapytania
mevdiven

9

W SQLServer Management Studio:

Narzędzia -> Opcje -> Projektanci -> Projektanci tabel i baz danych

  • Odznacz opcję „Zapobiegaj zapisywaniu zmian, które wymagają ponownego utworzenia tabeli”.

Następnie:

  • kliknij prawym przyciskiem myszy tabelę, dla której chcesz zmienić kolejność kolumn.
  • kliknij „Projekt”.
  • Przeciągnij kolumny do żądanej kolejności.
  • na koniec kliknij Zapisz.

SQLServer Management studio usunie tabelę i odtworzy ją przy użyciu danych.


6

Możesz to zrobić, tworząc nową tabelę, kopiując wszystkie dane, usuwając starą tabelę, a następnie zmieniając nazwę nowej, aby zastąpić starą.

Możesz także dodać nowe kolumny do tabeli, skopiować dane kolumny po kolumnie, upuścić stare kolumny, a następnie zmienić nazwy nowych kolumn, aby pasowały do ​​starych. Prosty przykład poniżej: 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
napisałem procedurę składowaną, która robi coś podobnego. Automatyzuje odbudowę tabeli za pomocą dynamicznego SQL. caseyplummer.wordpress.com/2013/07/22/…
Casey Plummer

6

W SQLServer Management Studio:

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

Odznacz Prevent saving changes that require table re-creation.

Teraz możesz zmienić kolejność stołu.


2

Serwer SQL wewnętrznie skompiluj skrypt. Tworzy tymczasową tabelę z nowymi zmianami i kopiuje dane i usuwa bieżącą tabelę, a następnie ponownie tworzy wstawkę do tabeli z tabeli tymczasowej. Odnajduję go z opcji „Generuj skrypt zmiany” ssms 2014. Skrypt taki. Z tego miejsca: Jak zmienić kolejność kolumn w tabeli za pomocą zapytania 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

Jeśli Twoja tabela ma wystarczającą liczbę kolumn, możesz spróbować. Najpierw utwórz nową tabelę z preferowaną kolejnością kolumn.

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

Teraz upuść tabelę za pomocą polecenia drop

    drop table table_name;

teraz zmień nazwę nowo utworzonej tabeli na starą nazwę tabeli.

    rename new to table_name;

teraz wybierz tabelę, masz uporządkowane kolumny zgodnie z wcześniejszymi preferencjami.

    select * from table_name;

Działa to tak samo, jak tworzenie nowej tabeli, kopiowanie danych z istniejącej tabeli do nowej, usuwanie starej i zmiana nazwy nowej. Ściśle mówiąc, nie zmienia to kolejności kolumn w tabeli. Ponieważ tworzy to / kopiuje ze starej tabeli, w przypadku dużych tabel zajmuje to trochę czasu. Wreszcie, proponowana składnia nie działa w t-sql.
Jean-François,

0

Ostatecznie nie możesz tego zrobić w MS SQL. Niedawno utworzyłem tabele w podróży (uruchamianie aplikacji) przy użyciu przechowywanej procedury, która czyta z tabeli odnośników. Kiedy tworzyłem widok, który łączył je z inną tabelą, którą ręcznie utworzyłem wcześniej (ten sam schemat, z danymi), nie powiodło się - po prostu dlatego, że użyłem opcji „Wybierz * UNION Select *” dla widoku. Jednocześnie, jeśli używam tylko tych utworzonych za pomocą procedury składowanej, odnoszę sukces.

Podsumowując: jeśli jest jakaś aplikacja, która zależy od kolejności kolumn, to naprawdę nie jest to dobre programowanie i na pewno spowoduje problemy w przyszłości. Kolumny powinny swobodnie znajdować się w dowolnym miejscu i być używane w dowolnym procesie przetwarzania danych (WSTAW, AKTUALIZUJ, WYBIERZ).


0

Możesz to osiągnąć, wykonując następujące czynności:

  1. usuń wszystkie klucze obce i klucz podstawowy oryginalnej tabeli.

  2. zmienić nazwę oryginalnej tabeli.

  3. używając CTAS utwórz oryginalną tabelę w żądanej kolejności.

  4. upuść stary stół.

  5. zastosuj wszystkie wiązania z powrotem do oryginalnej tabeli


0

Jeśli kolumny do zmiany kolejności zostały niedawno utworzone i są puste, można je usunąć i ponownie dodać we właściwej kolejności.

Zdarzyło mi się to podczas ręcznego rozszerzania bazy danych w celu dodania nowej funkcjonalności i przegapiłem kolumnę, a kiedy ją dodałem, sekwencja była nieprawidłowa.

Po znalezieniu tutaj odpowiedniego rozwiązania po prostu poprawiłem tabelę, używając następujących poleceń.

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

Uwaga: zrób to tylko wtedy, gdy nie masz danych w kolumnach, które upuszczasz.

Ludzie mówią, że kolejność kolumn nie ma znaczenia. Regularnie używam SQL Server Management Studio do „generowania skryptów” do tworzenia tekstowej wersji schematu bazy danych. Aby efektywnie kontrolować wersje tych skryptów (git) i porównywać je (WinMerge), konieczne jest, aby dane wyjściowe z kompatybilnych baz danych były takie same, a wyróżnione różnice są autentycznymi różnicami w bazach danych.

Kolejność kolumn ma znaczenie; ale tylko dla niektórych, nie dla wszystkich!


0

Przypuszczam, że chcesz dodać nową kolumnę w określonej pozycji. Możesz utworzyć nową kolumnę, przenosząc bieżące kolumny w prawo.

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

Usuń wszystkie indeksy, których to dotyczy, i odniesienia do kluczy obcych. Dodaj nową kolumnę z dokładnie takim samym typem danych jak ostatnia kolumna i skopiuj tam dane.

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

Zmień typ danych w trzeciej kolumnie na taki sam jak w poprzedniej kolumnie i skopiuj tam dane.

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

Zmień odpowiednio nazwy kolumn, ponownie utwórz usunięte indeksy i odniesienia do kluczy obcych.

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

Zmień typ danych w drugiej kolumnie.

Pamiętaj, że kolejność kolumn jest tylko „kosmetyczną” rzeczą, jak powiedział marc_s .


-1

Posługiwać się

SELECT * FROM TABLE1

który wyświetla domyślną kolejność kolumn w tabeli.

Jeśli chcesz zmienić kolejność kolumn.

Określ nazwę kolumny, która ma być wyświetlana odpowiednio

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

Pytanie nie dotyczy tymczasowego zamówienia. Pytanie dotyczy struktury projektu tabeli, gdy zmieniasz tabelę i dodajesz nowe kolumny.
vikas Chaturvedi

-1

możesz użyć indeksowania .. Po zindeksowaniu, jeśli wybierz * z XXXX wyniki powinny być zgodne z indeksem, ale tylko zestaw wyników .. nie structrue z tabeli


-1

Możesz to zmienić za pomocą zapytania SQL. Oto zapytanie sql, aby zmienić kolejność kolumn.

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

Zastanawiam się, czy to spada i odtwarza tabelę jak w SSMS. Tak czy inaczej, nie rzuciłbym kostką, robiąc to na produkcyjnej bazie danych, chociaż ta metoda wydaje się interesująca i warta uwagi.
samis

Ta funkcja nie działa w SQL Server, jak określono w OP. Chciałbym, żeby tak było.
Bill

1
To jest składnia MySQL, a nie SQL Server.
Jon Schneider,

-1

Aby mieć określoną kolejność kolumn, musisz wybierać kolumny w żądanej kolejności. Kolejność wyboru określa kolejność kolumn w wynikach.


-1

Wypróbuj to polecenie:

alter table students modify age int(5) first; 

Spowoduje to zmianę pozycji wieku na pierwszą pozycję.


To nie jest poprawny SQL w MSSQL. Może MySQL lub inny dialekt, ale nie dla SQL Server 2005
nsimeonov

-2

zmień nazwę tabeli zmodyfikuj najpierw nazwę kolumny int (5); przeniesie kolumnę na pierwszą zmianę nazwy tabeli. edit nazwa_kolumny int (5) po (nazwa_tabeli);


-3

Przykład: Zmień pozycję field_priority po field_price w statusie tabeli.

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

2
To jest składnia MySQL, a nie SQL Server.
Jon Schneider
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.