Подтвердить что ты не робот

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

/* 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

Два: добавьте COLUMN/UPDATE/DROP COLUMN/RENAME

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

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

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

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

enter image description here

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

enter image description here

Ответ 4

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

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

Ответ 5

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

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

Ответ 6

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

Ответ 7

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

Ответ 8

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

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

Ответ 9

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

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 '[email protected]+' from  #Stagintbl'+'';
Insert into originaltbl
Execute(@Sqlquery)

Ответ 10

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

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

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

Марк