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

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

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

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

Ответы [ 8 ]

71 голосов
/ 05 августа 2008

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

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

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

41 голосов
/ 01 февраля 2013

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

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

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

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

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

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

5 голосов
/ 06 августа 2008

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

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

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

3 голосов
/ 05 августа 2008

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

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

Редактировать: избили!

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

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

1 голос
/ 06 ноября 2014

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

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

Имя, Фамилия, Номер телефона, Электронная почта и Member_ID

Вы хотите, чтобы он указал их идентификатор, затем Фамилия, затем Имя, затем Телефон, затем Электронная почта.

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

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

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

Select LastName, *
From T_Testing

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

Пример:

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

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

0 голосов
/ 03 сентября 2016

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

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

0 голосов
/ 06 октября 2008

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...