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

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

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

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

Ответов (8)

Решение

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

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

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

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

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

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

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

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

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

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

Допустим, у вас есть 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

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

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

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

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

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

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

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

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

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

If all of your queries are written with SELECT * FROM TABLE - then they will show up in the output as they are laid out in SQL.

If your queries are written with SELECT Field1, Field2 FROM TABLE - then the order they are laid out in SQL does not matter.

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

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

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