Як змінити порядок стовпців у таблиці за допомогою запиту sql на сервері sql 2005?


109

Як змінити порядок стовпців у таблиці за допомогою SQL-запиту в SQL Server 2005?

Я хочу змінити порядок стовпців у таблиці за допомогою SQL-запиту.


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

Ви говорите про порядок стовпців для оператора SELECT або про порядок стовпців у визначенні таблиці?
marc_s

Відповіді:


111

Ви не можете. Порядок стовпців - це просто "косметична" річ, про яку ми піклуємося - для SQL Server - це майже завжди абсолютно не має значення.

Що робить SQL Server Management Studio у фоновому режимі, коли ви змінюєте порядок стовпців, це відтворення таблиці з нуля за допомогою нової CREATE TABLEкоманди, копіювання даних із старої таблиці та її видалення.

Немає команди SQL для визначення впорядкування стовпців.


4
Ні, у SQL Server такого немає - і не повинно бути в жодному реальному RBDMS - порядок стовпців не є концепцією, що стосується таблиці SQL
marc_s

68
@marc_s Немає вагомих причин проти підтримки замовлення стовпців. Навіть якщо це лише візуально. Це дозволяє полегшити перегляд даних у таблиці із заданим порядком стовпців, коли ви робите "SELECT *". Я розробник і постійно роблю такі запити. Ви можете зекономити деякий час за допомогою хорошого попередньо визначеного порядку стовпців. З будь-якої іншої точки зору, звичайно, немає сенсу: нічого не повинно залежати від порядку стовпців. До речі, є стовпець ORDINAL_POSITION, коли ви запитуєте "INFORMATION_SCHEMA.COLUMNS". Я не знаю, що це означає ... але це має мати щось спільне з цим.
JotaBe

18
Порядок стовпців є релевантним, наприклад, коли використовується INSERT INTO, не вказуючи назви стовпців. Інший приклад - ЗАМОВИТИ ЗА індексом стовпця замість назви стовпця. Обидві дії, очевидно, не рекомендуються, але SQL Server дозволяє це, щоб хтось десь використав її, можливо, порушивши код T-SQL під час зміни порядку стовпців.
Карвелліс

12
@Carvelis: НІКОЛИ не слід використовувати, INSERTне чітко вказуючи стовпці!
marc_s

2
@marc_s: абсолютно, але я зазвичай не єдиний, хто працює над проектом. Я бачив досить багато проектів, де люди використовували такий код.
Карвелліс

30

Ви повинні чітко перелічити поля в тому порядку, коли ви хочете, щоб вони були повернені, а не використовувати * для замовлення "за замовчуванням".

оригінальний запит:

select * from foobar

повертає

foo bar
--- ---
  1   2

тепер пиши

select bar, foo from foobar

bar foo
--- ---
  2   1

Відповідь вище неправильна, чи не так? Ця відповідь буквально показує, як замовити стовпці, чому попередній має галочку, а цей - ні?
Агент Лу

1
@Agent Lu Проблема полягає у формулюванні оригінального питання. Ми з Марком трактували питання ОП про "зміну порядку стовпців" по-різному. Він наводить вагомий аргумент, чому порядок стовпців не має значення у збереженій таблиці (хоча імена є). Я показав, як можна отримати дані в іншому порядку стовпців. Зовсім не те саме!
lexu

23

згідно з http://msdn.microsoft.com/en-us/library/aa337556.aspx

Це завдання не підтримується за допомогою операторів Transact-SQL.

Ну, це можна зробити, використовуючи create/ copy / drop/ rename, на що відповідає komma8.komma1

Або ви можете скористатися SQL Server Management Studio

  1. У Провіднику об’єктів клацніть правою кнопкою миші таблицю зі стовпцями, які ви хочете змінити впорядкування, і натисніть Дизайн (Змінити в версії 2005 SP1 або новішої версії)
  2. Виберіть поле зліва від назви стовпця, яке ви хочете змінити. (Ви можете вибрати кілька стовпців, утримуючи клавіші [shift] або [ctrl] на клавіатурі.)
  3. Перетягніть стовпці в інше місце в межах таблиці.

Потім натисніть кнопку "Зберегти". Цей метод насправді скидає та відтворює таблицю, тому можуть виникнути деякі помилки.

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

Якщо його вимкнено, в меню Інструменти> Опції> Дизайнери слід очистити зміни для збереження змін, які потребують опції відновлення таблиці , інакше виникне помилка "Збереження змін не дозволено" .

  • Відключення запобігання збереженню змін, які потребують опції відновлення таблиці , Microsoft наполегливо не рекомендує, оскільки це призводить до того, що існуюча інформація відстеження змін буде видалена під час створення таблиці, тому ніколи не слід вимикати цю опцію, якщо зміна відстеження є включено!

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

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


1
Заява " This task cannot be performed using Transact-SQL statements." в документі була помилковою. Я пояснив автора і попросив його змінити його на " This task is not supported using Transact-SQL statements.". Близько дня тому автор погодився і документ було виправлено. Ви можете слідкувати за дискусією, яку ми мали на GitHub .
Ronen Ariely

@RonenAriely гарна робота, і дякую за те, що повідомили мені. Я оновив свою відповідь
robotik

Вас вітають @robotik 😀. Я сподіваюся, що всі ці, хто приїде сюди і побачить відповідь найбільшою кількістю голосів, зрозуміють, що це тотальна помилка. На жаль, Громади зазвичай поводяться як табун (велика рогата худоба), і коли лідер та топ-внесок (який вважається найкращим експертом) у громаді допустили помилку, то інші йдуть за ним, як це сталося в цій темі. Люди продовжують голосувати за помилку, якщо вона вже отримала багато голосів (підхід: "оскільки всі так говорять, то це правда"), а інші люди, які прийдуть на форум, подумають, що це правильна відповідь.
Ronen Ariely

1
@RonenAriely, тому я завжди прокручую вниз :)
robotik

13

Це схоже на питання про впорядкування записів у результаті запиту .. і, як правило, ніхто не любить формально правильну відповідь ;-)

Отже, ось що:

  • відповідно до стандарту SQL, стовпці таблиці не "впорядковані"
  • як результат, a select *не змушує повернути стовпці в певному порядку
  • як правило, кожен RDBMS має своєрідний порядок "за замовчуванням" (зазвичай це порядок, який стовпці додавали до таблиці, або в create table' or in theтаблицю alter add `
  • отже, якщо ви покладаєтесь на порядок стовпців (оскільки ви використовуєте результати запиту для виведення якоїсь іншої структури даних з позиції стовпців), явно перелічіть стовпці в тому порядку, в якому ви їх хочете.

11

Звичайно, ви можете змінити порядок стовпців у заяві sql. Однак якщо ви хочете абстрагувати фізичний порядок стовпців, ви можете створити подання. тобто

CREATE TABLE myTable(
    a int NULL,
    b varchar(50) NULL,
    c datetime NULL
);


CREATE VIEW vw_myTable
AS
SELECT c, a, b
  FROM myTable;

select * from myTable;
a  b  c
-  -  -

select * from vw_myTable
c  a  b
-  -  -

чи це змінює час запиту?
сліпий

@blindguy ні, це не змінює ваш час запиту
mevdiven

9

У студії управління SQLServer:

Інструменти -> Параметри -> Дизайнери -> Дизайнери таблиць і баз даних

  • Зніміть прапорець "Запобігати збереженню змін, які потребують відновлення таблиці".

Тоді:

  • клацніть правою кнопкою миші таблицю, для якої потрібно замовити стовпці.
  • натисніть "Дизайн".
  • Перетягніть стовпці до потрібного порядку.
  • нарешті, натисніть кнопку "Зберегти".

Студія управління SQLServer видасть таблицю і відтворить її за допомогою даних.


6

Ви можете зробити це, створивши нову таблицю, скопіюйте всі дані, скиньте стару таблицю, а потім перейменуйте нову, щоб замінити стару.

Ви також можете додати нові стовпці до таблиці, скопіювати стовпчик за даними стовпців, скинути старі стовпці та перейменувати нові стовпці, щоб відповідати старим. Простий приклад нижче: http://sqlfiddle.com/#!3/67af4/1

CREATE TABLE TestTable (
    Column1 INT,
    Column2 VARCHAR(255)
);
GO

insert into TestTable values(1, 'Test1');
insert into TestTable values(2, 'Test2');
GO

select * from TestTable;
GO

ALTER TABLE TestTable ADD Column2_NEW VARCHAR(255);
ALTER TABLE TestTable ADD Column1_NEW INT;
GO

update TestTable 
set Column1_NEW = Column1, 
    Column2_NEW = Column2;
GO

ALTER TABLE TestTable DROP COLUMN Column1;
ALTER TABLE TestTable DROP COLUMN Column2;
GO

sp_rename 'TestTable.Column1_NEW', 'Column1', 'COLUMN';
GO
sp_rename 'TestTable.Column2_NEW', 'Column2', 'COLUMN';
GO

select * from TestTable;
GO

1
Я написав збережену процедуру, яка робить щось подібне. Він автоматизує перебудову таблиць за допомогою динамічного SQL. caseyplummer.wordpress.com/2013/07/22/…
Кейсі Пламмер

6

У студії управління SQLServer:

Tools-> Options->Designers ->Table and Database Designers

Скасувати вибір Prevent saving changes that require table re-creation .

Тепер ви можете упорядкувати таблицю.


2

Сервер Sql внутрішньо будує сценарій. Він створює тимчасову таблицю з новими змінами та копіює дані та видаляє поточну таблицю, а потім відтворює вставку таблиці з таблиці темп. Я знаходжу це у варіанті ssms 2014. "Створити сценарій зміни". Сценарій такий. Звідси : Як змінити порядок стовпців у таблиці за допомогою запиту sql

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_emps
    (
    id int NULL,
    ename varchar(20) NULL
    )  ON [PRIMARY]
GO
ALTER TABLE dbo.Tmp_emps SET (LOCK_ESCALATION = TABLE)
GO
IF EXISTS(SELECT * FROM dbo.emps)
     EXEC('INSERT INTO dbo.Tmp_emps (id, ename)
        SELECT id, ename FROM dbo.emps WITH (HOLDLOCK TABLOCKX)')
GO
DROP TABLE dbo.emps
GO
EXECUTE sp_rename N'dbo.Tmp_emps', N'emps', 'OBJECT' 
GO
COMMIT

1

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

    create table new as select column1,column2,column3,....columnN from table_name;

Тепер опустіть таблицю за допомогою команди drop

    drop table table_name;

тепер перейменуйте новостворену таблицю у стару назву таблиці.

    rename new to table_name;

тепер виберіть таблицю, ви переставляєте стовпці так, як раніше.

    select * from table_name;

Це те саме, що створити нову таблицю, скопіювати дані з існуючої таблиці в нову, видалити стару та перейменувати нову. Так строго кажучи, це не зміна порядку стовпців таблиці. Оскільки це створює / копіює зі старої таблиці, потрібен час для величезних таблиць. І останнє, але не менш важливе, запропонований синтаксис не працює в t-sql.
Жан-Франсуа

0

Зрештою, ви просто не можете цього зробити в MS SQL. Нещодавно я створив таблиці на ходу (запуск програми), використовуючи збережену процедуру, що читається з таблиці пошуку. Коли я створив подання, яке поєднало їх з іншою таблицею, яку я створив раніше вручну (одна і та ж схема, з даними), це не вдалося - просто тому, що я використовував для перегляду '' Select * UNION Select * '. У той же час, якщо я використовую лише ті, що створені за допомогою збереженої процедури, я маю успіх.

На закінчення: Якщо є якась програма, яка залежить від порядку стовпця, це дійсно не добре програмування і напевно створить проблеми в майбутньому. Стовпці повинні "почувати себе вільними" будь-де та бути використаними для будь-якого процесу обробки даних (ВСТАВКА, ОНОВЛЕННЯ, ВИБІР).


0

Ви можете досягти цього за допомогою наступних кроків:

  1. видаліть усі сторонні ключі та первинний ключ вихідної таблиці.

  2. перейменувати оригінальну таблицю.

  3. за допомогою CTAS створіть оригінальну таблицю в потрібному вам порядку.

  4. скинути старий стіл.

  5. застосувати всі обмеження до початкової таблиці


0

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

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

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

ALTER TABLE  tablename  DROP COLUMN  columnname; 
ALTER TABLE  tablename  ADD columnname columntype;

Примітка. Робіть це лише в тому випадку, якщо у вас немає даних у стовпцях, які ви випадаєте.

Люди сказали, що порядок стовпців не має значення. Я регулярно використовую SQL Server Management Studio для "створення сценаріїв" для створення текстової версії схеми бази даних. Щоб ефективно керувати версіями цих скриптів (git) та порівнювати їх (WinMerge), необхідно, щоб вихід із сумісних баз даних був однаковим, а виділені відмінності - справжніми відмінностями в базі даних.

Порядок стовпців має значення; але просто деяким людям, не всім!


0

Я думаю, ви хочете додати новий стовпець у певному положенні. Ви можете створити новий стовпець, перемістивши поточні стовпці праворуч.

+---+---+---+
| A | B | C |
+---+---+---+

Видаліть усі індекси та посилання на закордонні ключі. Додайте новий стовпець із таким самим типом даних, як останній стовпець, і скопіюйте туди дані.

+---+---+---+---+
| A | B | C | C |
+---+---+---+---+
          |___^

Змініть тип даних третього стовпця на такий же тип, як попередній стовпець, і скопіюйте туди дані.

+---+---+---+---+
| A | B | B | C | 
+---+---+---+---+
      |___^

Відповідно перейменуйте стовпці, відтворіть видалені індекси та посилання іноземних ключів.

+---+---+---+---+
| A | D | B | C | 
+---+---+---+---+

Зміна типу даних другого стовпчика.

Майте на увазі, що порядок стовпців - це лише "косметична" річ, як сказано в marc_s .


-1

Використовуйте

SELECT * FROM TABLE1

який відображає таблицю порядку стовпців за замовчуванням.

Якщо ви хочете змінити порядок стовпців.

Вкажіть ім'я стовпця для відповідного відображення

SELECT COLUMN1, COLUMN5, COLUMN4, COLUMN3, COULMN2 FROM TABLE1

Питання не про тимчасове замовлення. Питання стосується структури дизайну таблиці, коли ви змінюєте таблицю та додаєте нові стовпці.
vikas Chaturvedi

-1

Ви можете використовувати індексацію. Після індексації, якщо виберіть * з XXXX, результати повинні бути відповідно до індексу, але лише встановити результат .. не структуру таблиці


-1

Ви можете змінити це за допомогою SQL-запиту. Ось sql запит на зміну послідовності стовпця.

ALTER TABLE table name 
CHANGE COLUMN `column1` `column1` INT(11) NOT NULL COMMENT '' AFTER `column2`;

Цікаво, чи не вдається це відтворити та відтворити таблицю, як у SSMS. Так чи інакше, я б не перекидав кубики, роблячи це на виробничій БД, хоча цей метод здається цікавим і вартий розгляду.
Саміс

Ця функціональність не працює в SQL Server, як було визначено ОП. Хочеться, щоб це було.
Білл

1
Це синтаксис MySQL, а не SQL Server.
Джон Шнайдер

-1

Для того, щоб мати певний порядок стовпців, вам потрібно вибрати стовпчик за стовпцем у бажаному порядку. Порядок вибору диктує, як будуть упорядковані стовпці у висновку.


-1

Спробуйте цю команду:

alter table students modify age int(5) first; 

Це змінить вікове положення на перше.


Це недійсний SQL в MSSQL. Можливо, MySQL чи інший діалект, але не для SQL Server 2005
nsimeonov

-2

змінити ім’я таблиці спочатку змінити ім'я стовпця int (5); приведе стовпець до першої зміни імені таблиці, змінить ім'я стовпця int (5) після (ім'я таблиці);


-3

Приклад: Змінення позиції field_priority після field_price у статусі таблиці.

ALTER TABLE `status` CHANGE `priority` `priority` INT(11) NULL DEFAULT NULL AFTER `price`;

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