Как изменить порядок столбцов в таблице с помощью SQL-запроса в SQL Server 2005?
Я хочу изменить порядок столбцов в таблице с помощью SQL-запроса.
Как изменить порядок столбцов в таблице с помощью SQL-запроса в SQL Server 2005?
Я хочу изменить порядок столбцов в таблице с помощью SQL-запроса.
Ответы:
Ты не можешь. Порядок столбцов - это просто «косметическая» вещь, которая заботит нас, людей, - для SQL Server он почти всегда абсолютно не важен.
Когда вы меняете порядок столбцов, SQL Server Management Studio в фоновом режиме создает таблицу с нуля с помощью новой CREATE TABLE
команды, копирует данные из старой таблицы и затем удаляет их.
Нет команды SQL для определения порядка столбцов.
INSERT
не должны использовать без явного указания столбцов!
Вы должны явно указать поля в том порядке, в котором вы хотите, чтобы они возвращались, вместо использования * для «по умолчанию» порядка.
исходный запрос:
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
/ rename, как ответил komma8.komma1
Или вы можете использовать SQL Server Management Studio
- В обозревателе объектов щелкните правой кнопкой мыши таблицу со столбцами, порядок которых необходимо изменить, и выберите команду « Дизайн» ( изменить в версии 2005 SP1 или более ранней).
- Установите флажок слева от имени столбца, порядок которого вы хотите изменить. (Вы можете выбрать несколько столбцов, удерживая клавиши [shift] или [ctrl] на клавиатуре.)
- Перетащите столбцы в другое место в таблице.
Затем нажмите "Сохранить". Этот метод фактически удаляет и воссоздает таблицу, поэтому могут возникнуть некоторые ошибки.
Если для базы данных и таблицы включена опция отслеживания изменений , вам не следует использовать этот метод.
Если он отключен, параметр « Запретить сохранение изменений, требующих повторного создания таблицы» должен быть снят в меню «Инструменты»> «Параметры»> «Дизайнеры», в противном случае появится ошибка «Сохранение изменений не разрешено» .
Проблемы также могут возникнуть при создании первичного и внешнего ключей.
Если возникает какая-либо из вышеперечисленных ошибок, сохранение не выполняется, что оставляет вам исходный порядок столбцов.
This task cannot be performed using Transact-SQL statements.
" в документе неверно. Я объяснил автору и попросил его поменять его на " This task is not supported using Transact-SQL statements.
". Примерно день назад автор согласился, и документ был исправлен. Вы можете следить за нашим обсуждением на GitHub .
Это похоже на вопрос об упорядочивании записей в результате запроса .. и обычно никому не нравится формально правильный ответ ;-)
Итак, вот оно:
select *
не заставляет возвращать столбцы в определенном порядкеcreate table' or in the
инструкции alter table add `Конечно, вы можете изменить порядок столбцов в инструкции 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
- - -
В SQLServer Management Studio:
Инструменты -> Параметры -> Дизайнеры -> Дизайнеры таблиц и баз данных
Затем:
Студия SQLServer Management отбросит таблицу и воссоздает ее, используя данные.
Вы можете сделать это, создав новую таблицу, скопировав все данные, отбросив старую таблицу, а затем переименовав новую, чтобы заменить старую.
Вы также можете добавить новые столбцы в таблицу, скопировать данные столбца за столбцом, удалить старые столбцы, а затем переименовать новые столбцы, чтобы они соответствовали старым. Простой пример ниже: 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:
Tools
-> Options
-> Designers
->Table and Database Designers
Отменить выбор Prevent saving changes that require table re-creation
.
Теперь вы можете изменить порядок таблицы.
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
Если в вашей таблице достаточно столбцов, вы можете попробовать это. Сначала создайте новую таблицу с предпочтительным порядком столбцов.
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;
В конце концов, вы просто не можете сделать это в MS SQL. Недавно я создал таблицы на ходу (запуск приложения), используя хранимую процедуру, которая считывается из таблицы поиска. Когда я создал представление, которое объединило их с другой таблицей, которую я создал вручную ранее (та же схема, с данными), это не удалось - просто потому, что я использовал для представления «Select * UNION Select *». В то же время, если я использую только те, которые созданы с помощью хранимой процедуры, я добиваюсь успеха.
В заключение: если есть какое-либо приложение, которое зависит от порядка столбцов, это действительно плохое программирование и наверняка создаст проблемы в будущем. Столбцы должны свободно располагаться где угодно и использоваться для любого процесса обработки данных (INSERT, UPDATE, SELECT).
Вы можете добиться этого с помощью следующих шагов:
удалить все внешние ключи и первичный ключ исходной таблицы.
переименовать исходную таблицу.
используя CTAS, создайте исходную таблицу в желаемом порядке.
отбросьте старую таблицу.
применить все ограничения обратно к исходной таблице
Если столбцы, которые нужно переупорядочить, были недавно созданы и пусты, тогда столбцы можно удалить и снова добавить в правильном порядке.
Это случилось со мной, когда я вручную расширял базу данных для добавления новых функций, и я пропустил столбец, и когда я добавил его, последовательность была неправильной.
Не найдя здесь подходящего решения, я просто исправил таблицу, используя следующие команды.
ALTER TABLE tablename DROP COLUMN columnname;
ALTER TABLE tablename ADD columnname columntype;
Примечание: делайте это только в том случае, если у вас нет данных в отбрасываемых столбцах.
Люди говорят, что порядок столбцов не имеет значения. Я регулярно использую SQL Server Management Studio для создания сценариев для создания текстовой версии схемы базы данных. Для эффективного управления версиями этих сценариев (git) и их сравнения (WinMerge) обязательно, чтобы выходные данные совместимых баз данных были одинаковыми, а выделенные различия - подлинные различия баз данных.
Порядок столбцов имеет значение; но только некоторым, а не всем!
Я полагаю, вы хотите добавить новый столбец в определенную позицию. Вы можете создать новый столбец, переместив текущие столбцы вправо.
+---+---+---+
| A | B | C |
+---+---+---+
Удалите все затронутые индексы и ссылки на внешние ключи. Добавьте новый столбец с тем же типом данных, что и последний столбец, и скопируйте туда данные.
+---+---+---+---+
| A | B | C | C |
+---+---+---+---+
|___^
Измените тип данных третьего столбца на тот же тип, что и в предыдущем столбце, и скопируйте данные туда.
+---+---+---+---+
| A | B | B | C |
+---+---+---+---+
|___^
Соответственно переименуйте столбцы, воссоздайте удаленные индексы и ссылки на внешние ключи.
+---+---+---+---+
| A | D | B | C |
+---+---+---+---+
Измените тип данных второго столбца.
Имейте в виду, что порядок столбцов - это просто "косметическая вещь", как сказал marc_s .
Использовать
SELECT * FROM TABLE1
который отображает порядок столбцов таблицы по умолчанию.
Если вы хотите изменить порядок столбцов.
Укажите имя столбца, которое будет отображаться соответственно
SELECT COLUMN1, COLUMN5, COLUMN4, COLUMN3, COULMN2 FROM TABLE1
Вы можете изменить это с помощью SQL-запроса. Вот sql-запрос для изменения последовательности столбца.
ALTER TABLE table name
CHANGE COLUMN `column1` `column1` INT(11) NOT NULL COMMENT '' AFTER `column2`;
Для того, чтобы иметь определенный порядок столбцов, вам необходимо выбирать столбец за столбцом в желаемом порядке. Порядок выбора определяет порядок расположения столбцов на выходе.
Попробуйте эту команду:
alter table students modify age int(5) first;
Это изменит позицию возраста на первую позицию.
изменить имя таблицы сначала изменить имя столбца int (5); приведет столбец к первому изменить имя таблицы изменить имя столбца int (5) после (имя таблицы);
Пример: изменить позицию field_priority после field_price в статусе таблицы.
ALTER TABLE `status` CHANGE `priority` `priority` INT(11) NULL DEFAULT NULL AFTER `price`;