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.
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.
Odpowiedzi:
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 TABLE
polecenia, skopiowaniu danych ze starej tabeli, a następnie upuszczeniu jej.
Nie ma polecenia SQL definiującego kolejność kolumn.
INSERT
bez wyraźnego określenia kolumn!
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
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
- 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)
- Zaznacz pole po lewej stronie nazwy kolumny, którą chcesz zmienić. (Możesz zaznaczyć wiele kolumn, przytrzymując klawisze [shift] lub [ctrl] na klawiaturze).
- 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” .
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.
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 .
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:
select *
nie wymusza zwrócenia kolumn w określonej kolejnościcreate table' or in the
tablicy alter add `instrukcjeMoż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
- - -
W SQLServer Management Studio:
Narzędzia -> Opcje -> Projektanci -> Projektanci tabel i baz danych
Następnie:
SQLServer Management studio usunie tabelę i odtworzy ją przy użyciu danych.
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
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.
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
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;
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).
Możesz to osiągnąć, wykonując następujące czynności:
usuń wszystkie klucze obce i klucz podstawowy oryginalnej tabeli.
zmienić nazwę oryginalnej tabeli.
używając CTAS utwórz oryginalną tabelę w żądanej kolejności.
upuść stary stół.
zastosuj wszystkie wiązania z powrotem do oryginalnej tabeli
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!
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 .
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
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`;
Aby mieć określoną kolejność kolumn, musisz wybierać kolumny w żądanej kolejności. Kolejność wyboru określa kolejność kolumn w wynikach.
Wypróbuj to polecenie:
alter table students modify age int(5) first;
Spowoduje to zmianę pozycji wieku na pierwszą pozycję.
zmień nazwę tabeli zmodyfikuj najpierw nazwę kolumny int (5); przeniesie kolumnę na pierwszą zmianę nazwy tabeli. edit nazwa_kolumny int (5) po (nazwa_tabeli);
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`;