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

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

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

Ответы [ 20 ]

87 голосов
/ 22 октября 2009

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

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

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

22 голосов
/ 22 октября 2009

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

оригинальный запрос:

select * from foobar

возвращает

foo bar
--- ---
  1   2

сейчас напишу

select bar, foo from foobar

bar foo
--- ---
  2   1
19 голосов
/ 15 июля 2014

Согласно http://msdn.microsoft.com/en-us/library/aa337556.aspx

Эту задачу нельзя выполнить с помощью операторов Transact-SQL.

Ну, это может быть, используя create / copy / drop / переименовать, как ответил komma8.komma1

Или вы можете использовать SQL Server Management Studio

  1. В Object Explorer , щелкните правой кнопкой мыши таблицу со столбцами, которую вы хотите переупорядочить, и выберите Дизайн (Изменить в версии 2005 SP1 или более ранней)
  2. Установите флажок слева от названия столбца, который вы хотите изменить. (Вы можете выбрать несколько столбцов, удерживая клавишу [Shift] или клавиши [ctrl] на клавиатуре.)
  3. Перетащите столбец (столбцы) в другое место в таблице.

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

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

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

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

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

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

12 голосов
/ 22 октября 2009

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

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

  • в соответствии со стандартом SQL, столбцы в таблице не "упорядочены"
  • , в результате select * не заставляет возвращать столбцы в определенном порядке
  • как правило, каждая СУБД имеет своего рода порядок «по умолчанию» (обычно порядок, в котором столбцы были добавлены в таблицу, либо в таблицу create table' or in the alter добавьте `операторов
  • , поэтому, если вы полагаетесь на порядокстолбцов (поскольку вы используете результаты запроса для наложения некоторой другой структуры данных с позиции столбцов), явно перечислите столбцы в том порядке, в котором вы их хотите.
10 голосов
/ 22 октября 2009

Конечно, вы можете изменить порядок столбцов в SQL-выражении. Однако, если вы хотите абстрагировать физический порядок столбцов таблиц, вы можете создать представление. * 1001 то есть *

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
-  -  -
6 голосов
/ 17 мая 2016

В SQLServer Management Studio:

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

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

Тогда:

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

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

5 голосов
/ 24 мая 2014

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

Вы также можете добавить новые столбцы в таблицу, скопировать данные столбца за столбцом, удалить старые столбцы, а затем переименовать новые столбцы, чтобы они соответствовали старым. Простой пример ниже: 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
3 голосов
/ 30 августа 2018

В SQLServer Management Studio:

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

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

Теперь вы можете изменить порядок таблицы.

1 голос
/ 23 сентября 2016

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 голос
/ 19 февраля 2016

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

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

Теперь удалите таблицу с помощью команды удаления

    drop table table_name;

теперь переименуйте вновь созданную таблицу в имя старой таблицы.

    rename new to table_name;

Теперь выберите таблицу, колонки переставлены так, как вы предпочитали раньше.

    select * from table_name;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...