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


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.


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


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.


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!


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.


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.



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

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.