Как изменить порядок столбцов в таблице с помощью sql-запроса в sql server 2005?

109

Как изменить порядок столбцов в таблице с помощью SQL-запроса в SQL Server 2005?

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

Химадри
источник
3
Если вы имеете в виду изменение положения столбцов в том виде, в котором они существуют в таблице, вам необходимо создать новую таблицу с предпочтительным порядком, вставить данные из старой таблицы, а затем отбросить исходную таблицу. Насколько мне известно, другого способа сделать это нет.
Майкл Тодд,
Вы говорите о порядке столбцов в операторе SELECT или о порядке столбцов в определении таблицы?
marc_s

Ответы:

111

Ты не можешь. Порядок столбцов - это просто «косметическая» вещь, которая заботит нас, людей, - для SQL Server он почти всегда абсолютно не важен.

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

Нет команды SQL для определения порядка столбцов.

marc_s
источник
4
Нет, в SQL Server такого нет - и его не должно быть ни в одной реальной RBDMS - порядок столбцов не имеет отношения к таблице SQL
marc_s
68
@marc_s Нет веских причин против поддержки порядка столбцов. Даже если это только наглядно. Это просто может упростить просмотр данных в таблице с заданным порядком столбцов, когда вы сделаете «SELECT *». Я разработчик и все время задаю подобные вопросы. Вы можете сэкономить время, выбрав заранее заданный порядок столбцов. С любой другой точки зрения это, конечно, не имеет смысла: от порядка столбцов ничего не должно зависеть. Между прочим, есть столбец ORDINAL_POSITION, когда вы запрашиваете "INFORMATION_SCHEMA.COLUMNS". Я не знаю, что это значит ... но, должно быть, это как-то связано с этим.
JotaBe
19
Порядок столбцов важен, например, при использовании INSERT INTO без указания имен столбцов. Другой пример - индекс столбца ORDER BY вместо имени столбца. Оба, очевидно, не рекомендуются, но SQL Server допускает это, поэтому кто-то мог использовать его где-то, возможно, нарушив код T-SQL при изменении порядка столбцов.
Carvellis
12
@Carvelis: вы НИКОГДАINSERT не должны использовать без явного указания столбцов!
marc_s
2
@marc_s: конечно, но обычно я не единственный, кто работает над проектом. Я видел довольно много проектов, в которых люди использовали такой код.
Carvellis
30

Вы должны явно указать поля в том порядке, в котором вы хотите, чтобы они возвращались, вместо использования * для «по умолчанию» порядка.

исходный запрос:

select * from foobar

возвращается

foo bar
--- ---
  1   2

теперь пиши

select bar, foo from foobar

bar foo
--- ---
  2   1
lexu
источник
Ответ выше неверен, не так ли? Этот ответ буквально показывает, как упорядочить столбцы, почему у предыдущего есть галочка, а у этого нет?
Агент Лу
1
@Agent Lu Проблема в формулировке исходного вопроса. Мы с Марком по-разному интерпретировали вопрос OP для «изменения порядка столбцов». Он приводит веские аргументы в пользу того, почему порядок столбцов в сохраненной таблице не имеет значения (хотя имена имеют значение). Я показал, как данные могут быть извлечены в другом порядке столбцов. Совсем не одно и то же!
lexu 02
24

согласно 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. Перетащите столбцы в другое место в таблице.

Затем нажмите "Сохранить". Этот метод фактически удаляет и воссоздает таблицу, поэтому могут возникнуть некоторые ошибки.

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

Если он отключен, параметр « Запретить сохранение изменений, требующих повторного создания таблицы» должен быть снят в меню «Инструменты»> «Параметры»> «Дизайнеры», в противном случае появится ошибка «Сохранение изменений не разрешено» .

  • Отключение сохранения изменений Предотвратить , которые требуют таблиц воссоздания вариант настоятельно рекомендуются против Майкрософт, поскольку это приводит к существующему отслеживанию изменений информации, удаляются , когда таблица воссоздана, так что вы не должны никогда отключить эту опцию , если отслеживание изменений включен!

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

Если возникает какая-либо из вышеперечисленных ошибок, сохранение не выполняется, что оставляет вам исходный порядок столбцов.

роботик
источник
1
Утверждение " This task cannot be performed using Transact-SQL statements." в документе неверно. Я объяснил автору и попросил его поменять его на " This task is not supported using Transact-SQL statements.". Примерно день назад автор согласился, и документ был исправлен. Вы можете следить за нашим обсуждением на GitHub .
Ронен Ариэли
@RonenAriely, хорошая работа, и спасибо, что сообщили мне. Я обновил свой ответ
robotik
Добро пожаловать, @robotik 😀. Я надеюсь, что все, кто придет сюда и увидит ответ с наибольшим количеством голосов, поймут, что это полная ошибка. К сожалению, сообщества обычно ведут себя как стадо (крупный рогатый скот), и как только лидер и главный участник (который считается ведущим экспертом) в сообществе совершили ошибку, другие следуют за ним, как это произошло в этой ветке. Люди продолжают голосовать за ошибку, если она уже получила много голосов (подход: «раз все так говорят, значит это правда»), и другие люди, которые придут на форум, подумают, что это правильный ответ.
Ронен Ариэли
1
@RonenAriely, поэтому я всегда прокручиваю вниз :)
robotik
14

Это похоже на вопрос об упорядочивании записей в результате запроса .. и обычно никому не нравится формально правильный ответ ;-)

Итак, вот оно:

  • согласно стандарту SQL столбцы в таблице не "упорядочены"
  • в результате a select *не заставляет возвращать столбцы в определенном порядке
  • как правило, каждая СУБД имеет своего рода порядок «по умолчанию» (обычно порядок, в котором столбцы были добавлены в таблицу, либо в create table' or in theинструкции alter table add `
  • поэтому, если вы полагаетесь на порядок столбцов (поскольку вы используете результаты запроса для добавления какой-либо другой структуры данных из положения столбцов), явно перечислите столбцы в том порядке, в котором они вам нужны.
Thorsten
источник
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
@blindguy нет, это не меняет время вашего запроса
mevdiven
9

В SQLServer Management Studio:

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

  • Снимите флажок «Запретить сохранение изменений, требующих повторного создания таблицы».

Затем:

  • Щелкните правой кнопкой мыши таблицу, в которой нужно изменить порядок столбцов.
  • нажмите "Дизайн".
  • Перетащите столбцы в желаемом порядке.
  • наконец, нажмите "Сохранить".

Студия SQLServer Management отбросит таблицу и воссоздает ее, используя данные.

Тим Коннолли
источник
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
komma8.komma1
источник
1
Я написал хранимую процедуру, которая делает нечто подобное. Он автоматизирует восстановление таблицы с помощью динамического SQL. caseyplummer.wordpress.com/2013/07/22/…
Кейси Пламмер
6

В SQLServer Management Studio:

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.
Jean-François
0

В конце концов, вы просто не можете сделать это в MS SQL. Недавно я создал таблицы на ходу (запуск приложения), используя хранимую процедуру, которая считывается из таблицы поиска. Когда я создал представление, которое объединило их с другой таблицей, которую я создал вручную ранее (та же схема, с данными), это не удалось - просто потому, что я использовал для представления «Select * UNION Select *». В то же время, если я использую только те, которые созданы с помощью хранимой процедуры, я добиваюсь успеха.

В заключение: если есть какое-либо приложение, которое зависит от порядка столбцов, это действительно плохое программирование и наверняка создаст проблемы в будущем. Столбцы должны свободно располагаться где угодно и использоваться для любого процесса обработки данных (INSERT, UPDATE, SELECT).

Chagbert
источник
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
Solairaja
источник
Вопрос не во временном заказе. Вопрос касается структуры дизайна таблицы, когда вы изменяете таблицу и добавляете новые столбцы.
Викас Чатурведи
-1

вы можете использовать индексацию .. После индексации, если выбрать * из XXXX, результаты должны быть в соответствии с индексом, но только набор результатов .. не структура таблицы

Karthik.M
источник
-1

Вы можете изменить это с помощью SQL-запроса. Вот sql-запрос для изменения последовательности столбца.

ALTER TABLE table name 
CHANGE COLUMN `column1` `column1` INT(11) NOT NULL COMMENT '' AFTER `column2`;
Аашай Шах
источник
Интересно, удаляется ли это и воссоздает таблицу, как в SSMS. В любом случае я бы не стал бросать кости, делая это в производственной БД, хотя этот метод кажется интересным и заслуживает внимания.
саамы
Эта функция не работает в SQL Server, как было указано в OP. Желаю, чтобы это произошло.
Билл,
1
Это синтаксис MySQL, а не SQL Server.
Джон Шнайдер
-1

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

Наурис Круминьш
источник
-1

Попробуйте эту команду:

alter table students modify age int(5) first; 

Это изменит позицию возраста на первую позицию.

Мваву Роджерс
источник
Это недопустимый SQL в MSSQL. Может быть, MySQL или какой-нибудь другой диалект, но не для SQL Server 2005
nsimeonov 08
-2

изменить имя таблицы сначала изменить имя столбца int (5); приведет столбец к первому изменить имя таблицы изменить имя столбца int (5) после (имя таблицы);

Фархан Сайт
источник
-3

Пример: изменить позицию field_priority после field_price в статусе таблицы.

ALTER TABLE `status` CHANGE `priority` `priority` INT(11) NULL DEFAULT NULL AFTER `price`;
Lecaoquochung
источник
2
Это синтаксис MySQL, а не SQL Server.
Джон Шнайдер