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

StackOverflow https://stackoverflow.com/questions/769828

Вопрос

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

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

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

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

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

enter image description here

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

enter image description here

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

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

На самом деле это то, что 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 Management Studio делает то, что сказал Хосе Базилио.А если у вас большая таблица, то менять порядок столбцов таким образом нецелесообразно.

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

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

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

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

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

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

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

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

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)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top