Могу ли я изменить порядок столбцов в таблице логически?


93

Если я добавляю столбец в таблицу в Microsoft SQL Server, могу ли я контролировать логическое отображение столбца в запросах?

Я не хочу возиться с физическим расположением столбцов на диске, но я хотел бы логически сгруппировать столбцы, когда это возможно, чтобы такие инструменты, как SQL Server Management Studio, отображали содержимое таблицы удобным способом.

Я знаю, что могу сделать это с помощью SQL Management Studio, перейдя в их режим «дизайна» для таблиц и перетащив порядок столбцов, но я бы хотел иметь возможность делать это в необработанном SQL, чтобы я мог выполнять упорядочивание сценарий из командной строки.


Слишком поздно для ответа, но взгляните на эту ссылку. blog.sqlauthority.com/2013/03/11/…
sqluser



и еще один связанный с этим вопрос о том, имеет ли это значение stackoverflow.com/questions/6692021/…
Тим Абелл,

microsoft connect: синтаксис ALTER TABLE для изменения порядка столбцов - ответ, как обычно, похож на шоколадный чайник WONTFIX
Тим Абелл

Ответы:


78

Вы не можете сделать это программно (то есть безопасным способом) без создания новой таблицы.

Когда вы фиксируете переупорядочение, Enterprise Manager создает новую таблицу, перемещает данные, затем удаляет старую таблицу и переименовывает новую таблицу с существующим именем.

Если вы хотите, чтобы ваши столбцы располагались в определенном порядке / группировались без изменения их физического порядка, вы можете создать представление, которое может быть любым.


43

Я думаю, что всем здесь не хватает, так это того, что, хотя не всем приходится иметь дело с 10, 20 или 1000 экземплярами одной и той же программной системы, установленной по всей стране и в мире ... те из нас, кто разрабатывает коммерчески продаваемое программное обеспечение, делают это. В результате мы со временем расширяем системы, расширяем таблицы, добавляя поля по мере необходимости, и поскольку эти поля идентифицированы, действительно принадлежат к существующей таблице, и, как таковая, более десяти лет расширения, увеличения, добавления полей и т. Д. в таблицы .... и затем необходимость работать с этими таблицами от дизайна до поддержки, иногда копаться в необработанных данных / устранять неполадки для отладки новых ошибок функциональности ... видеть в первой горстке полей,

Мне часто хотелось сделать это именно по этой причине. Но если не делать именно то, что делает SQL: создание сценария создания для новой таблицы так, как я хочу, запись в нее вставки, затем удаление всех существующих ограничений, отношений, ключей, индекса и т. Д. И т. Д. Из существующей таблицы и переименование "новую" таблицу обратно к старому имени, а затем чтение всех этих ключей, отношений, индекса и т. д. и т. д.

Это не только утомительно, отнимает много времени, но ... еще через пять лет это должно повториться ...

Это так близко к тому, чтобы стоить такого огромного объема работы, но суть в том, что ... это не последний раз, когда нам понадобится эта способность, поскольку наши системы будут продолжать расти, расширяться и получать поля в беспорядочном порядке, управляемом нужны / дизайнерские дополнения.

Большинство разработчиков думают с точки зрения единой системы, которая обслуживает одну компанию или очень специфический рынок жестких дисков.

«Готовые», но значительно прогрессивные дизайнеры и лидеры в области разработки на своем рынке всегда будут сталкиваться с этой проблемой снова и снова ... хотели бы творческое решение, если оно есть у кого-нибудь. Это могло бы легко сэкономить моей компании десяток часов в неделю, просто не прокручивая страницу или не запоминая, где это поле находится в таблице исходных данных ...


У нас была такая же проблема, и мы создали хранимую процедуру, которая автоматизирует этот процесс (переименование, создание новой таблицы, копирование, воссоздание всех внешних ключей, ограничений и т. Д.). Вам нужно только передать имя таблицы и новый порядок столбцов. Если это действительно может сэкономить вашей компании десятки часов в неделю, вам следует потратить время на написание аналогичного сценария. Нам потребовалось всего 2-3 дня, чтобы получить стабильный скрипт, который мы регулярно используем для изменения порядка столбцов. Он заботится обо всех функциях, которые мы используем в SqlServer (например, частичные индексы, индексированные представления и т. Д.), И состоит всего из около 400 LOC.
Андреас

1
Я не знаю, почему они не могут как-то абстрагироваться от расположения столбцов. Не нужно физически изменять порядок столбцов! Количество уровней PHD и не только инженерии в Sql Server поистине поразительно. Если учесть сложность генерации плана запроса, статистику, индексацию, и еще никто не встал и не сказал: «Давайте просто создадим таблицу, которая представляет ЛОГИЧЕСКИЙ порядок». FieldID Guid, OrderBy int. Выполнено. Затем SSMS или SELECT *использует это. Выключите его, если вы идеальный администратор базы данных и не хотите этого. Очень неприятно. И теперь мои столы достаточно велики, и я больше не могу использовать грубую силу.
Simon_Weaver

Я знаю, что это старый комментарий, но визуальная студия в проекте базы данных автоматически создает SQL-скрипт для физического изменения порядка столбцов, когда вы меняете схему таблицы и нажимаете кнопку публикации.
Muflix

5

Если я понимаю ваш вопрос, вы хотите повлиять на то, какие столбцы возвращаются первыми, вторыми, третьими и т. Д. В существующих запросах, верно?

Если все ваши запросы написаны с помощью SELECT * FROM TABLE-, тогда они будут отображаться в выводе, как они изложены в SQL.

Если ваши запросы написаны с помощью SELECT Field1, Field2 FROM TABLE- то порядок их расположения в SQL не имеет значения.


3

Когда Management Studio делает это, она создает временную таблицу, копирует все, удаляет исходную таблицу и переименовывает временную таблицу. Нет простого эквивалентного оператора T-SQL.

Если вам это не нравится, вы всегда можете создать представление таблицы со столбцами в нужном вам порядке и использовать это?

Редактировать: битый!


1

Есть один способ, но только временно для самого запроса. Например,

Допустим, у вас есть 5 столов. Таблица называетсяT_Testing

FirstName, LastName, PhoneNumber, Email и Member_ID

вы хотите, чтобы в нем был указан их идентификатор, затем фамилия, затем имя, затем телефон, а затем адрес электронной почты.

Вы можете сделать это в соответствии с выбором.

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

Кроме того, если вы по какой-то причине хотите, чтобы Фамилия отображалась перед именем, вы также можете сделать это следующим образом:

Select LastName, *
From T_Testing

Единственное, в чем вы хотите быть уверены, это то, что функция OrderBy или Where должна быть обозначена как Table.Column, если вы собираетесь использовать Where или OrderBy.

Пример:

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

Надеюсь, это поможет, я разобрался, потому что мне нужно было сделать это самому.


В этом запросе Select LastName, * Из T_Testing вы получаете LastName два раза.
sqluser

1
  1. Создайте скрипт для существующей таблицы в окне запроса.
  2. Запустите этот сценарий для тестовой базы данных (удалите оператор Use)
  3. Используйте SSMS, чтобы внести необходимые изменения столбца
  4. Щелкните Создать сценарий изменения (по умолчанию крайний левый и самый нижний значок на панели кнопок).
  5. Используйте этот скрипт против своего реального стола

Все, что действительно делает скрипт, - это создает вторую таблицу с желаемым порядком столбцов, копирует в нее все ваши данные, удаляет исходную таблицу и затем переименовывает вторичную таблицу, чтобы занять ее место. Это избавит вас от необходимости писать его самостоятельно, если вам понадобится сценарий развертывания.


0

Это можно сделать с помощью SQL, напрямую изменив системные таблицы. Например, посмотрите здесь:

Изменить таблицу - добавить новый столбец между

Однако я бы не рекомендовал играть с системными столами, за исключением случаев крайней необходимости.


0

Невозможно изменить порядок столбцов без воссоздания всей таблицы. Если у вас есть только несколько экземпляров базы данных, вы можете использовать для этого SSMS (выберите таблицу и нажмите «Дизайн»).

Если у вас слишком много экземпляров для ручного процесса, вам следует попробовать этот скрипт: https://github.com/Epaminaidos/reorder-columns

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.