Добавить новый столбец таблицы в определенную порядковую позицию в Microsoft SQL Server - PullRequest
37 голосов
/ 20 апреля 2009

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

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

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

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

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

Ответы [ 9 ]

26 голосов
/ 20 апреля 2009

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

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

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

11 голосов
/ 20 апреля 2009

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

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

enter image description here

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

enter image description here

6 голосов
/ 16 октября 2014

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

Один: создание / копирование / удаление / переименование

Это фактически то, что 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

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

Это сильно оскорбляет мое чувство порядка ... но иногда это просто не стоит переставлять.

3 голосов
/ 21 апреля 2009

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

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

0 голосов
/ 21 декабря 2018

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

select * FROM TEMP
select * from originaltbl
select * from #Stagintbl 



declare @ColumnName nvarchar(max);
set @ColumnName=(select
   distinct  
    stuff((
        select ',' + a.COLUMN_NAME
        from (select Column_name from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME='originaltbl') a

        for xml path('')
    ),1,1,'') as ColumnName)

declare @Sqlquery nvarchar(max)
set @Sqlquery='select '+@ColumnName+' from  #Stagintbl'+'';
Insert into originaltbl
Execute(@Sqlquery)
0 голосов
/ 26 августа 2018

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

ALTER TABLE `sakila`.`actor` 
CHANGE COLUMN `middle_name` `middle_name` VARCHAR(50) NULL DEFAULT NULL AFTER `first_name`; 
0 голосов
/ 13 марта 2018

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

0 голосов
/ 18 августа 2017

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

0 голосов
/ 14 июля 2016

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

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

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