Чи можу я логічно змінити порядок стовпців у таблиці?


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
Tim Abell

Відповіді:


77

Ви не можете зробити це програмно (безпечним способом), не створивши нову таблицю.

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

Якщо ви хочете, щоб ваші стовпці були в певному порядку / групуванні, не змінюючи їх фізичний порядок, ви можете створити подання, яке може бути яким завгодно.


43

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

Я часто хотів би зробити це саме з цієї причини. Але не роблячи саме того, що робить SQL, будуючи сценарій створення нової таблиці так, як я хочу, написавши в нього вставку, а потім скидаючи всі існуючі обмеження, взаємозв'язки, ключі, індекс тощо, тощо тощо з існуючої таблиці та перейменовуючи "нову" таблицю до старої назви, а потім читання всіх цих ключів, зв'язків, індексу тощо тощо ....

Це не тільки нудно, трудомістко, але ... ще через п’ять років доведеться повторити ....

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

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

"Готові", але суттєво прогресивні дизайнери та лідери розвитку на своєму ринковому просторі завжди повинні мати справу з цією проблемою, знову і знову ..... хотіли б отримати креативне рішення, якщо хтось його має. Це могло б легко заощадити мою компанію десяток годин на тиждень, просто не потрібно прокручувати сторінку або пам’ятати, де поле "те" знаходиться в таблиці вихідних даних ....


У нас була та сама проблема, і ми створили збережену процедуру, яка автоматизує цей процес (перейменувати, створити нову таблицю, скопіювати, відтворити всі зовнішні ключі, обмеження тощо). Вам потрібно лише передати назву таблиці та новий порядок стовпців. Якщо це могло насправді заощадити вашій компанії десятки годин на тиждень, вам слід витратити час на написання подібного сценарію. Для нас знадобилося лише близько 2-3 днів, щоб отримати стабільний сценарій, який ми використовуємо регулярно для переупорядкування стовпців. Він піклується про всі функції, які ми використовуємо в SqlServer (наприклад, часткові індекси, індексовані подання тощо), і складається лише з близько 400 LOC.
Андреас

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

Я знаю, що це старий коментар, але Visual Studio в рамках проекту бази даних автоматично створює сценарій SQL для фізичного переупорядкування стовпців, коли ви змінюєте схему таблиці та натискаєте опублікувати.
Муфлікс

5

Якщо я розумію ваше запитання, ви хочете вплинути на те, які стовпці повертаються першим, другим, третім тощо в існуючих запитах, так?

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

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


3

Коли Management Studio це робить, він створює тимчасову таблицю, копіює все, скидає початкову таблицю та перейменовує тимчасову таблицю. Не існує простого еквівалентного твердження T-SQL.

Якщо вам не до душі це робити, ви завжди можете створити подання таблиці зі стовпцями в потрібному порядку і використовувати це?

Редагувати: побили!


1

Є один спосіб, але це лише тимчасово для самого запиту. Наприклад,

Скажімо, у вас є 5 таблиць. Таблиця називаєтьсяT_Testing

Ім'я, Прізвище, Номер телефону, Електронна пошта та Ідентифікатор члена

ви хочете, щоб у ньому було вказано їх ідентифікатор, потім прізвище, потім ім’я, потім телефон, а потім електронна пошта.

Ви можете зробити це згідно з Select.

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

Крім цього, якщо ви просто хочете, щоб Прізвище з певних причин відображалося перед власним іменем, ви можете зробити це також наступним чином:

Select LastName, *
From T_Testing

Єдине, що ви хочете бути впевненими, що ви робите, це те, що функцію OrderBy або Where потрібно позначати як Table.Column, якщо ви збираєтеся використовувати Where or OrderBy

Приклад:

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

Сподіваюся, це допомагає, я зрозумів це, бо мені потрібно було це зробити самому.


У цьому запиті Виберіть Прізвище, * З T_Testing, Ви отримуєте Прізвище два рази.
sqluser

1
  1. Сценарій наявної таблиці у вікно запиту.
  2. Запустіть цей сценарій проти тестової бази даних (видаліть оператор Use)
  3. Використовуйте SSMS, щоб внести потрібні зміни у стовпці
  4. Клацніть «Створити сценарій зміни» (за замовчуванням крайній і нижній значок на панелі кнопок)
  5. Використовуйте цей сценарій проти вашої реальної таблиці

Все, що насправді робить сценарій - це створити другу таблицю таблиці з бажаними порядками стовпців, скопіювати в неї всі ваші дані, скинути вихідну таблицю, а потім перейменувати вторинну таблицю, щоб вона зайняла своє місце. Це врятує вас від написання самостійно, хоча якщо вам потрібен сценарій розгортання.



0

Неможливо змінити порядок стовпців без відтворення цілої таблиці. Якщо у вас є лише кілька екземплярів бази даних, ви можете використовувати для цього SSMS (виберіть таблицю та натисніть "дизайн").

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.