Добавление нового столбца таблицы в определенную порядковую позицию в Microsoft SQL Server

можно ли добавить столбец в таблицу в определенной порядковой позиции в Microsoft SQL Server?

например, наши таблицы всегда имеют столбцы CreatedOn, CreatedBy, LastModifiedOn, LastModifiedBy в "конце" каждого определения таблицы? Я бы хотел, чтобы новый столбец отображался в SSMS над этими столбцами.

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

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

http://www.developersdex.com/sql/message.asp?p=581&r=5014513

9 ответов


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

Это то, что SQL Management Studio делает за кулисами.

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


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

Один: Создать/Копировать/Падение / Переименовать

это на самом деле то, что SQL Server делает в графическом интерфейсе: вот пример сценария, который он генерирует и выполняет, когда вы нажимаете кнопку "Сохранить" после добавления нового столбца в начало таблицы.

/* To prevent any potential data loss issues, you should review this script in detail before running it outside the context of the database designer.*/
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_SomeTable
    (
    MyNewColumn int NOT NULL,
    OriginalIntColumn int NULL,
    OriginalVarcharColumn varchar(100) NULL
    )  ON [PRIMARY]
     TEXTIMAGE_ON [PRIMARY]
GO
ALTER TABLE dbo.Tmp_SomeTable SET (LOCK_ESCALATION = TABLE)
GO
SET IDENTITY_INSERT dbo.Tmp_SomeTable ON
GO
IF EXISTS(SELECT * FROM dbo.SomeTable)
     EXEC('INSERT INTO dbo.Tmp_SomeTable (OriginalIntColumn, OriginalVarcharColumn FROM dbo.SomeTable WITH (HOLDLOCK TABLOCKX)')
GO
SET IDENTITY_INSERT dbo.Tmp_SomeTable OFF
GO
DROP TABLE dbo.SomeTable
GO
EXECUTE sp_rename N'dbo.Tmp_SomeTable', N'SomeTable', 'OBJECT' 
GO

GO
COMMIT

два: добавить СТОЛБЕЦ / ОБНОВИТЬ / УДАЛИТЬ СТОЛБЕЦ / ПЕРЕИМЕНОВАТЬ

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

CREATE TABLE MyTest (a int, b int, d int, e int)

INSERT INTO MyTest (a,b,d,e) VALUES(1,2,4,5)

SELECT * FROM MyTest -- your current table

ALTER TABLE MyTest ADD c int -- add a new column
ALTER TABLE MyTest ADD d_new int -- create copies of the existing columns you want to move
ALTER TABLE MyTest ADD e_new int

UPDATE MyTest SET d_new = d, e_new = e -- transfer data to the new columns

ALTER TABLE MyTest DROP COLUMN d -- remove the originals
ALTER TABLE MyTest DROP COLUMN e

EXEC SP_RENAME 'MyTest.d_new', 'd'; -- rename the new columns
EXEC SP_RENAME 'MyTest.e_new', 'e';

SELECT * FROM MyTest 

DROP TABLE MyTest -- clean up the sample

три: жить с этим


перейдите в SQL Server management Studio и" создайте " существующую таблицу. Вставить столбец в центре, щелкните правой кнопкой мыши в пустой области и выберите Создать Сценарий Изменения...

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

enter image description here

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

enter image description here


насколько мне известно, нет известного метода изменения порядка столбца. За кулисами SQL Management Studio делает то, что сказал Хосе Базилио. И если у вас есть большая таблица, то непрактично изменять порядок столбцов таким образом.

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


TFS 2013 сделает это за вас автоматически.

добавьте новые столбцы в таблицу в любом случае, а затем зафиксируйте изменения в TFS. Оттуда вы можете открыть файл sql таблицы в Visual Studio и вручную переместить порядок столбцов в скрипте создания T-SQL. Затем вы можете обновить целевую базу данных с помощью инструмента сравнения схем VS, найденного в разделе Инструменты > SQL Server > новое сравнение схем. Выберите проект базы данных с изменением в качестве источник и база данных, которую вы хотите обновить в качестве цели. Сравните, выберите сценарий таблицы и обновите его. VS упадет и добавит автоматически. Все ваши данные будут в безопасности, и индексы тоже.


грязный и простой.
Экспорт таблицы в CSV.
Вставить новые данные в нужное положение.
Откидной стол.
Создайте новую таблицу с требуемыми спецификациями столбцов.
Загрузите столбцы из csv в новую таблицу.


Я думаю, что просто добавить столбец ALTER TABLE table1 ADD .. а затем создайте таблицу tmp, такую как tmp_table1 из select like SELECT col1,col2,col5,col3,col4 into tmp_table1 from table1; а затем отбросьте table1 и переименуйте tmp_table1 в table1, то есть. Я надеюсь, что это поможет кому-то


Я не уверен, что поток все еще активен. У меня был тот же запрос с базой данных MySQL. Щелкните правой кнопкой мыши таблицу и выберите "ALTER" автоматически сгенерированный код ниже. Образец предоставлен из sakila db, и он работал. Просто узнайте столбец, после которого вы хотите разместить свой новый столбец и использовать ключевое слово "AFTER"

ALTER TABLE `sakila`.`actor` 
CHANGE COLUMN `middle_name` `middle_name` VARCHAR(50) NULL DEFAULT NULL AFTER `first_name`; 

вы не можете создать столбец в определенное порядковое место в структуре таблицы - плюс, почему вы хотите?? Порядок столбцов в SQL Server совершенно не имеет значения.

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

нет Команды SQL DDL для создания столбца в определенном месте или для" переупорядочивания " столбцов. Это действительно не нужно.

Марк