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

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

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

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

9 ответов

Решение

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  1. Откройте таблицу в SSMS в режиме конструктора:

  2. Измените порядок столбцов:

    Важно не сохранять изменения.

  3. Нажмите кнопку «Создать сценарий изменения»:

  4. Теперь откроется окно, содержащее скрипт для применения этого изменения:

    Скопируйте текст из окна.

В этом случае он сгенерировал следующий код:

      /* To prevent any potential data loss issues, you should review this script in detail before running it outside the context of the database designer.*/
BEGIN TRANSACTION
SET QUOTED_IDENTIFIER ON
SET ARITHABORT ON
SET NUMERIC_ROUNDABORT OFF
SET CONCAT_NULL_YIELDS_NULL ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
COMMIT
BEGIN TRANSACTION
GO
CREATE TABLE dbo.Tmp_MyTable
    (
    Id int NOT NULL,
    Name nvarchar(30) NULL,
    Country nvarchar(50) NOT NULL
    )  ON [PRIMARY]
GO
ALTER TABLE dbo.Tmp_MyTable SET (LOCK_ESCALATION = TABLE)
GO
IF EXISTS(SELECT * FROM dbo.MyTable)
     EXEC('INSERT INTO dbo.Tmp_MyTable (Id, Name, Country)
        SELECT Id, Name, Country FROM dbo.MyTable WITH (HOLDLOCK TABLOCKX)')
GO
DROP TABLE dbo.MyTable
GO
EXECUTE sp_rename N'dbo.Tmp_MyTable', N'MyTable', 'OBJECT' 
GO
COMMIT

Как видите, он делает следующее: 1) создает новую временную таблицу, 2) копирует данные во временную таблицу, 3) удаляет исходную таблицу и 4) переименовывает временную таблицу в имя исходной таблицы.

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

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

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

Вы хотите, чтобы он перечислил их 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

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

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

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

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

Другие вопросы по тегам