Czy mogę logicznie zmienić kolejność kolumn w tabeli?

94

Jeśli dodaję kolumnę do tabeli w programie Microsoft SQL Server, czy mogę kontrolować, gdzie kolumna jest wyświetlana logicznie w zapytaniach?

Nie chcę mieszać w fizycznym układzie kolumn na dysku, ale chciałbym logicznie grupować kolumny, jeśli to możliwe, aby narzędzia takie jak SQL Server Management Studio wyświetlały zawartość tabeli w wygodny sposób.

Wiem, że mogę to zrobić za pomocą programu SQL Management Studio, przechodząc do ich trybu „projektowania” tabel i przeciągając kolejność kolumn, ale chciałbym móc to zrobić w surowym języku SQL, aby móc wykonać porządkowanie skrypty z wiersza poleceń.

Fastcall
źródło
Za późno na odpowiedź, ale spójrz na ten link. blog.sqlauthority.com/2013/03/11/…
sqluser
i inne powiązane pytanie, czy ma to znaczenie stackoverflow.com/questions/6692021/ ...
Tim Abell
microsoft connect: składnia ALTER TABLE do zmiany kolejności kolumn - odpowiedź jest jak zwykle typowa dla czekoladowo-czajniczek WONTFIX
Tim Abell

Odpowiedzi:

79

Nie możesz tego zrobić programowo (to znaczy w bezpieczny sposób) bez tworzenia nowej tabeli.

Po zatwierdzeniu zmiany kolejności Enterprise Manager tworzy nową tabelę, przenosi dane, a następnie usuwa starą tabelę i zmienia nazwę nowej tabeli na istniejącą.

Jeśli chcesz, aby kolumny były w określonej kolejności / grupowaniu bez zmiany ich fizycznej kolejności, możesz utworzyć widok, który może być dowolny.

vzczc
źródło
43

Myślę, że tym, czego tu brakuje, jest to, że chociaż nie każdy musi radzić sobie z dziesięcioleciami, dwudziestymi lub tysiącami przypadków tego samego systemu oprogramowania zainstalowanego w całym kraju i na świecie ... ci z nas, którzy projektują oprogramowanie sprzedawane na rynku, robią to. W rezultacie z czasem rozbudowujemy systemy, rozszerzamy tabele, dodając pola, ponieważ potrzebne są nowe możliwości, a po zidentyfikowaniu tych pól należą one do istniejącej tabeli i jako takie przez ponad dekadę rozszerzaliśmy, powiększaliśmy, dodawaliśmy pola itp. do tabel ... a następnie konieczność pracy z tymi tabelami od projektu, przez wsparcie, po czasami zagłębianie się w surowe dane / rozwiązywanie problemów w celu debugowania nowych błędów funkcjonalnych ... niezwykle irytujące jest brak podstawowych informacji, które chcesz zobacz w pierwszej garści pól,

Często żałowałem, że nie mogę tego zrobić, właśnie z tego powodu. Ale poza robieniem dokładnie tego, co robi SQL, budowanie skryptu tworzenia dla nowej tabeli tak, jak chcę, pisanie do niego wstawki, a następnie usuwanie wszystkich istniejących ograniczeń, relacji, kluczy, indeksu itp. Itd. Z istniejącej tabeli i zmiana nazwy „nowa” tabela z powrotem do starej nazwy, a następnie odczytanie wszystkich tych kluczy, powiązań, indeksu itp.

Jest nie tylko żmudne i czasochłonne, ale ... za pięć lat będzie musiało się powtórzyć ...

Jest tak blisko wartości tej ogromnej ilości pracy, ale chodzi o to ... nie będzie to ostatni raz, kiedy będziemy potrzebować tej umiejętności, ponieważ nasze systemy będą nadal rosły, rozszerzały się i otrzymywały pola w zwariowanej kolejności napędzanej przez potrzeby / dodatki projektowe.

Większość programistów myśli z punktu widzenia pojedynczego systemu, który obsługuje jedną firmę lub bardzo specyficzny rynek twardych pudełek.

Zwykli, ale zdecydowanie postępowi projektanci i liderzy rozwoju w swojej przestrzeni rynkowej zawsze będą musieli zmierzyć się z tym problemem w kółko ..... z chęcią skorzystaliby z kreatywnego rozwiązania, gdyby ktoś je miał. Mogłoby to z łatwością zaoszczędzić mojej firmie kilkanaście godzin tygodniowo, bez konieczności przewijania lub zapamiętywania, gdzie w tabeli danych źródłowych znajduje się „to” pole ....

Philip Coyner
źródło
Mieliśmy ten sam problem i stworzyliśmy procedurę składowaną, która automatyzuje ten proces (zmiana nazwy, utworzenie nowej tabeli, skopiowanie, odtworzenie wszystkich kluczy obcych, ograniczenia itp.). Musisz tylko podać nazwę tabeli i nową kolejność kolumn. Jeśli to rzeczywiście mogłoby zaoszczędzić Twojej firmie dziesiątki godzin tygodniowo, powinieneś poświęcić czas na napisanie podobnego scenariusza. Dla nas zajęło nam to tylko około 2-3 dni, aby mieć stabilny skrypt, którego używamy rutynowo do zmiany kolejności kolumn. Dba o wszystkie funkcje, których używamy w SqlServer (np. Indeksy częściowe, widoki indeksowane itp.) I składa się tylko z około 400 LOC.
Andreas
1
Nie wiem, dlaczego nie mogą jakoś wyodrębnić układu kolumn. Nie trzeba fizycznie zmieniać kolejności kolumn! Ilość poziomu PHD i poza inżynierią w Sql Server jest naprawdę zdumiewająca. Jeśli weźmiesz pod uwagę złożoność generowania planu zapytań, statystyki, indeksowanie i nikt jeszcze nie wstał i nie powiedział: „Zróbmy po prostu tabelę reprezentującą LOGICZNY porządek. FieldID Guid, OrderBy int. Gotowe. Następnie SSMS lub SELECT *używa tego. Wyłącz to, jeśli jesteś idealnym DBA i nie chcesz tego. Bardzo frustrujące. A teraz moje stoły są na tyle duże, że nie mogę już tego brutalnie na siłę.
Simon_Weaver,
Wiem, że to stary komentarz, ale Visual Studio w ramach projektu bazy danych automatycznie tworzy skrypt SQL do fizycznej zmiany kolejności kolumn, gdy zmienisz schemat tabeli i klikniesz publikację.
Muflix
5

Jeśli rozumiem Twoje pytanie, chcesz wpłynąć na to, które kolumny są zwracane jako pierwsze, drugie, trzecie itd. W istniejących zapytaniach, prawda?

Jeśli wszystkie zapytania są napisane za pomocą SELECT * FROM TABLE- pojawią się na wyjściu tak, jak są ułożone w SQL.

Jeśli twoje zapytania są pisane SELECT Field1, Field2 FROM TABLE- to kolejność ich ułożenia w SQL nie ma znaczenia.

Otto
źródło
3

Kiedy Management Studio to robi, tworzy tabelę tymczasową, kopiuje wszystko w poprzek, usuwa pierwotną tabelę i zmienia nazwę tabeli tymczasowej. Nie ma prostego odpowiednika instrukcji T-SQL.

Jeśli nie masz ochoty tego robić, zawsze możesz utworzyć widok tabeli z kolumnami w żądanej kolejności i użyć tego?

Edycja: pobity!

tagi2k
źródło
1

Jest jeden sposób, ale tylko tymczasowo dla samego zapytania. Na przykład,

Powiedzmy, że masz 5 stołów. Tabela nazywa sięT_Testing

FirstName, LastName, PhoneNumber, Email i Member_ID

chcesz, aby wyświetlał ich identyfikator, nazwisko, imię, nazwisko, telefon i e-mail.

Możesz to zrobić zgodnie z Select.

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

Poza tym, jeśli z jakiegoś powodu chcesz, aby LastName było wyświetlane przed imieniem, możesz to również zrobić w następujący sposób:

Select LastName, *
From T_Testing

Jedyne, co chcesz być pewien, to fakt, że funkcja OrderBy lub Where musi być oznaczona jako Table. Column, jeśli zamierzasz używać opcji Where lub Order By

Przykład:

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

Mam nadzieję, że to pomoże, rozgryzłem to, ponieważ musiałem to zrobić sam.

Steven
źródło
W tym zapytaniu Select LastName, * From T_Testing, otrzymasz LastName dwa razy.
sqluser
1
  1. Skrypt istniejącej tabeli do okna zapytania.
  2. Uruchom ten skrypt w testowej bazie danych (usuń instrukcję Use)
  3. Użyj programu SSMS, aby wprowadzić potrzebne zmiany w kolumnach
  4. Kliknij opcję Generuj skrypt zmiany (domyślnie skrajna lewa i najniższa ikona na pasku przycisków)
  5. Użyj tego skryptu na swoim prawdziwym stole

Wszystko, co naprawdę robi skrypt, to utworzenie drugiej tabeli tabeli z żądanymi kolejnością kolumn, skopiowanie do niej wszystkich danych, usunięcie oryginalnej tabeli, a następnie zmiana nazwy tabeli dodatkowej, aby ją zastąpić. Oszczędza to jednak samodzielnego pisania, jeśli potrzebujesz skryptu wdrażania.

Paweł
źródło
0

Nie można zmienić kolejności kolumn bez odtworzenia całej tabeli. Jeśli masz tylko kilka wystąpień bazy danych, możesz użyć do tego programu SSMS (wybierz tabelę i kliknij przycisk „projekt”).

Jeśli masz zbyt wiele instancji dla procesu ręcznego, powinieneś wypróbować ten skrypt: https://github.com/Epaminaidos/reorder-columns

Andreas
źródło