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


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

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

18 72

18 ответов:

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

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

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

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

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

select * from foobar

возвращает

foo bar
--- ---
  1   2

сейчас пишу

select bar, foo from foobar

bar foo
--- ---
  2   1

по состоянию на http://msdn.microsoft.com/en-us/library/aa337556.aspx

эта задача не может быть выполнена с помощью инструкций Transact-SQL.

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

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

  1. на Обозреватель Объектов щелкните правой кнопкой мыши таблицу со столбцами, которые вы хотите измените порядок и нажмите конструкция (изменения в ver. 2005 с пакетом обновления 1 или более ранней версии)
  2. установите флажок слева от имени столбца, который вы хотите изменить. (Можно выбрать несколько столбцов, удерживая клавишу [shift] или клавиши [ctrl] на клавиатуре.)
  3. перетащите столбец(ы) в другое место в таблице.

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

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

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

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

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

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

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

Итак...

  • согласно стандарту SQL, то столбцы в таблице не "заказали"
  • в результате a select * не заставляет столбцы возвращаться в определенном порядке
  • как правило, каждая СУБД имеет своего рода порядок" по умолчанию " (обычно порядок, в который были добавлены столбцы таблица, либо в create table' or in thealter table add ' statements
  • поэтому, если вы полагаетесь на порядок столбцов (потому что вы используете результаты запроса для создания некоторой другой структуры данных из позиции столбцов), явно перечислите столбцы в том порядке, в котором вы их хотите.

вы можете, конечно, изменить порядок столбцов в инструкции 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
-  -  -

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

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

В Среде SQLServer Management Studio:

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

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

затем:

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

SQLServer Среда Management studio удалит таблицу и воссоздаст ее с помощью данных.

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

    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;

Sql server внутренне построить сценарий. Он создает временную таблицу с новыми изменениями и копирует данные и отбрасывает текущую таблицу, а затем воссоздает вставку таблицы из временной таблицы. Я нахожу его из опции" Generate Change script " ssms 2014. Вот такой сценарий. От здесь: Как изменить порядок столбцов в таблице с помощью sql query

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

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

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

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

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

вы можете достичь этого с помощью следующих шагов:

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

  2. переименовать исходную таблицу.

  3. с помощью CTAS создайте исходную таблицу в нужном порядке.

  4. удалить старую таблицу.

  5. применить все ограничения обратно к исходной таблице

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

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

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

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

Примечание: только сделайте это, если у вас нет данных в Столбцах вы падаете.

люди сказали, что порядок столбцов не имеет значения. Я регулярно использую SQL Server Management Studio "generate scripts" для создания текстовой версии схемы базы данных. Для эффективного управления версиями этих сценариев (git) и их сравнения (WinMerge) необходимо, чтобы выходные данные из совместимых баз данных были одинаковыми, а выделенные различия-подлинными различиями в базе данных.

порядок столбцов имеет значение; но только для некоторых людей, а не для всех!

В Среде SQLServer Management Studio:

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

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

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

использовать

SELECT * FROM TABLE1

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

Если вы хотите изменить порядок столбцов.

указать имя столбца для отображения соответственно

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

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

изменить имя таблицы изменить имя столбца int (5) сначала; приведем колонну к первой alter table name modify columnname int (5) after (tablename);

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

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