Можно ли логически изменить порядок столбцов в таблице?
Если я добавляю столбец в таблицу в 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 не имеет значения.
- Скрипт вашей существующей таблицы в окно запроса.
- Запустите этот скрипт для тестовой базы данных (удалите оператор Use)
- Используйте SSMS для внесения необходимых изменений в столбцы.
- Нажмите "Создать скрипт изменения" (по умолчанию самый левый и самый нижний значок на панели кнопок)
- Используйте этот скрипт против вашей реальной таблицы
Все, что на самом деле делает скрипт, - это создает вторую таблицу таблиц с нужным порядком столбцов, копирует в нее все ваши данные, удаляет исходную таблицу и затем переименовывает вторичную таблицу, чтобы занять ее место. Это избавляет вас от написания этого самостоятельно, хотя вам нужен сценарий развертывания.
Невозможно изменить порядок столбцов без воссоздания всей таблицы. Если у вас есть только несколько экземпляров базы данных, вы можете использовать для этого SSMS (выберите таблицу и нажмите "Дизайн").
Если у вас слишком много экземпляров для ручного процесса, попробуйте этот скрипт: https://github.com/Epaminaidos/reorder-columns
Откройте таблицу в SSMS в режиме конструктора:
Измените порядок столбцов:
Важно не сохранять изменения.
Нажмите кнопку «Создать сценарий изменения»:
Теперь откроется окно, содержащее скрипт для применения этого изменения:
Скопируйте текст из окна.
В этом случае он сгенерировал следующий код:
/* 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, изменив системные таблицы напрямую. Например, посмотрите здесь:
Изменить таблицу - добавить новый столбец между
Однако я бы не советовал играть с системными столами, если это не является абсолютно необходимым.