Добавить новый столбец таблицы в определенную порядковую позицию в Microsoft SQL Server
Можно ли добавить столбец к таблице в определенной порядковой позиции в Microsoft SQL Server?
Например, наши таблицы всегда имеют столбцы CreatedOn, CreatedBy, LastModifiedOn, LastModifiedBy в конце каждого определения таблицы? Я хотел бы, чтобы новый столбец отображался в SSMS над этими столбцами.
Если я пишу все изменения в моей базе данных, есть ли способ сохранить этот порядок в конце таблицы?
К вашему сведению, я не пытаюсь начать пламенную войну, если это вообще нужно сделать. Если вы хотите прочитать о потоке, который быстро вырождается в это, вот хороший:
http://www.developersdex.com/sql/message.asp?p=581&r=5014513
Ответы
Ответ 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 для создания столбца в определенном месте или для "переупорядочения" столбцов. Это действительно не нужно.
Марк